Skip to content

Commit 71306d9

Browse files
more tests on implicit and explicit casting
1 parent 56db2a5 commit 71306d9

File tree

3 files changed

+62
-22
lines changed

3 files changed

+62
-22
lines changed

x-pack/plugin/esql/qa/testFixtures/src/main/resources/union_types.csv-spec

Lines changed: 47 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2090,7 +2090,7 @@ FROM date_nanos, date_nanos_union_types
20902090
warningRegex:evaluation of \[FROM .*date_nanos.*date_nanos_union_types.*\] failed, treating result as null. Only first 20 failures recorded.
20912091
warningRegex:java.lang.IllegalArgumentException: milliSeconds \[-1457696696640\] are before the epoch in 1970 and cannot be converted to nanoseconds
20922092

2093-
millis:date_nanos | nanos:date_nanos | a:datetime | b:date_nanos | c:date_nanos | d:date_nanos | e:datetime
2093+
millis:date_nanos | nanos:date_nanos | a:datetime | b:date_nanos | c:date_nanos | d:date_nanos | e:datetime
20942094
1999-10-23T12:15:03.360103847Z | 2023-01-23T13:55:01.543Z | 2023-01-23T13:55:01.543Z | 2023-01-23T13:55:01.543Z | 2023-01-23T13:55:01.543Z | 2023-01-23T13:55:01.543Z | 2023-01-23T13:55:01.543Z
20952095
1999-10-23T12:15:03.360Z | 2023-01-23T13:55:01.543123456Z | 2023-01-23T13:55:01.543Z | 2023-01-23T13:55:01.543123456Z | 2023-01-23T13:55:01.543123456Z | 2023-01-23T13:55:01.543Z | 2023-01-23T13:55:01.543Z
20962096
1999-10-23T12:15:03.360103847Z | 2023-02-23T13:33:34.937Z | 2023-02-23T13:33:34.937Z | 2023-02-23T13:33:34.937Z | 2023-02-23T13:33:34.937Z | 2023-02-23T13:33:34.937Z | 2023-02-23T13:33:34.937Z
@@ -2114,29 +2114,59 @@ required_capability: implicit_casting_date_and_date_nanos
21142114
FROM date_nanos, date_nanos_union_types
21152115
| EVAL a = nanos::datetime
21162116
| MV_EXPAND a
2117-
| KEEP a, millis, nanos
21182117
| SORT a, millis, nanos
21192118
| LIMIT 14
21202119
;
21212120

21222121
warningRegex:evaluation of \[FROM .*date_nanos.*date_nanos_union_types.*\] failed, treating result as null. Only first 20 failures recorded.
21232122
warningRegex:java.lang.IllegalArgumentException: milliSeconds \[-1457696696640\] are before the epoch in 1970 and cannot be converted to nanoseconds
21242123

2125-
a:datetime | millis:date_nanos | nanos:date_nanos
2126-
1923-10-23T12:15:03.360Z | 2023-10-23T12:15:03.360103847Z | null
2127-
2023-01-23T13:55:01.543Z | 1999-10-23T12:15:03.360Z | [2023-01-23T13:55:01.543123456Z, 2023-02-23T13:33:34.937193Z, 2023-03-23T12:15:03.360103847Z]
2128-
2023-01-23T13:55:01.543Z | 1999-10-23T12:15:03.360103847Z | [2023-01-23T13:55:01.543Z, 2023-02-23T13:33:34.937Z, 2023-03-23T12:15:03.360Z]
2129-
2023-02-23T13:33:34.937Z | 1999-10-23T12:15:03.360Z | [2023-01-23T13:55:01.543123456Z, 2023-02-23T13:33:34.937193Z, 2023-03-23T12:15:03.360103847Z]
2130-
2023-02-23T13:33:34.937Z | 1999-10-23T12:15:03.360103847Z | [2023-01-23T13:55:01.543Z, 2023-02-23T13:33:34.937Z, 2023-03-23T12:15:03.360Z]
2131-
2023-03-23T12:15:03.360Z | 1999-10-22T12:15:03.360Z | [2023-03-23T12:15:03.360103847Z, 2023-03-23T12:15:03.360103847Z, 2023-03-23T12:15:03.360103847Z]
2132-
2023-03-23T12:15:03.360Z | 1999-10-22T12:15:03.360Z | [2023-03-23T12:15:03.360103847Z, 2023-03-23T12:15:03.360103847Z, 2023-03-23T12:15:03.360103847Z]
2133-
2023-03-23T12:15:03.360Z | 1999-10-22T12:15:03.360Z | [2023-03-23T12:15:03.360103847Z, 2023-03-23T12:15:03.360103847Z, 2023-03-23T12:15:03.360103847Z]
2134-
2023-03-23T12:15:03.360Z | 1999-10-22T12:15:03.360103847Z | [2023-03-23T12:15:03.360Z, 2023-03-23T12:15:03.360Z, 2023-03-23T12:15:03.360Z]
2135-
2023-03-23T12:15:03.360Z | 1999-10-22T12:15:03.360103847Z | [2023-03-23T12:15:03.360Z, 2023-03-23T12:15:03.360Z, 2023-03-23T12:15:03.360Z]
2136-
2023-03-23T12:15:03.360Z | 1999-10-22T12:15:03.360103847Z | [2023-03-23T12:15:03.360Z, 2023-03-23T12:15:03.360Z, 2023-03-23T12:15:03.360Z]
2137-
2023-03-23T12:15:03.360Z | 1999-10-23T12:15:03.360Z | [2023-01-23T13:55:01.543123456Z, 2023-02-23T13:33:34.937193Z, 2023-03-23T12:15:03.360103847Z]
2138-
2023-03-23T12:15:03.360Z | 1999-10-23T12:15:03.360103847Z | [2023-01-23T13:55:01.543Z, 2023-02-23T13:33:34.937Z, 2023-03-23T12:15:03.360Z]
2139-
2023-10-23T12:15:03.360Z | 2023-10-23T12:15:03.360Z | 2023-10-23T12:15:03.360103847Z
2124+
millis:date_nanos | nanos:date_nanos | num:long | a:datetime
2125+
2023-10-23T12:15:03.360103847Z | null | 1698063303360103847 | 1923-10-23T12:15:03.360Z
2126+
1999-10-23T12:15:03.360Z | [2023-01-23T13:55:01.543123456Z, 2023-02-23T13:33:34.937193Z, 2023-03-23T12:15:03.360103847Z] | 0 | 2023-01-23T13:55:01.543Z
2127+
1999-10-23T12:15:03.360103847Z | [2023-01-23T13:55:01.543Z, 2023-02-23T13:33:34.937Z, 2023-03-23T12:15:03.360Z] | 0 | 2023-01-23T13:55:01.543Z
2128+
1999-10-23T12:15:03.360Z | [2023-01-23T13:55:01.543123456Z, 2023-02-23T13:33:34.937193Z, 2023-03-23T12:15:03.360103847Z] | 0 | 2023-02-23T13:33:34.937Z
2129+
1999-10-23T12:15:03.360103847Z | [2023-01-23T13:55:01.543Z, 2023-02-23T13:33:34.937Z, 2023-03-23T12:15:03.360Z] | 0 | 2023-02-23T13:33:34.937Z
2130+
1999-10-22T12:15:03.360Z | [2023-03-23T12:15:03.360103847Z, 2023-03-23T12:15:03.360103847Z, 2023-03-23T12:15:03.360103847Z] | 0 | 2023-03-23T12:15:03.360Z
2131+
1999-10-22T12:15:03.360Z | [2023-03-23T12:15:03.360103847Z, 2023-03-23T12:15:03.360103847Z, 2023-03-23T12:15:03.360103847Z] | 0 | 2023-03-23T12:15:03.360Z
2132+
1999-10-22T12:15:03.360Z | [2023-03-23T12:15:03.360103847Z, 2023-03-23T12:15:03.360103847Z, 2023-03-23T12:15:03.360103847Z] | 0 | 2023-03-23T12:15:03.360Z
2133+
1999-10-22T12:15:03.360103847Z | [2023-03-23T12:15:03.360Z, 2023-03-23T12:15:03.360Z, 2023-03-23T12:15:03.360Z] | 0 | 2023-03-23T12:15:03.360Z
2134+
1999-10-22T12:15:03.360103847Z | [2023-03-23T12:15:03.360Z, 2023-03-23T12:15:03.360Z, 2023-03-23T12:15:03.360Z] | 0 | 2023-03-23T12:15:03.360Z
2135+
1999-10-22T12:15:03.360103847Z | [2023-03-23T12:15:03.360Z, 2023-03-23T12:15:03.360Z, 2023-03-23T12:15:03.360Z] | 0 | 2023-03-23T12:15:03.360Z
2136+
1999-10-23T12:15:03.360Z | [2023-01-23T13:55:01.543123456Z, 2023-02-23T13:33:34.937193Z, 2023-03-23T12:15:03.360103847Z] | 0 | 2023-03-23T12:15:03.360Z
2137+
1999-10-23T12:15:03.360103847Z | [2023-01-23T13:55:01.543Z, 2023-02-23T13:33:34.937Z, 2023-03-23T12:15:03.360Z] | 0 | 2023-03-23T12:15:03.360Z
2138+
2023-10-23T12:15:03.360Z | 2023-10-23T12:15:03.360103847Z | 1698063303360103847 | 2023-10-23T12:15:03.360Z
2139+
;
2140+
2141+
ImplicitCastingMultiTypedFieldsInvalidNanosValidMillisExplicitCastToNanos
2142+
required_capability: date_nanos_type
2143+
required_capability: implicit_casting_date_and_date_nanos
2144+
2145+
FROM date_nanos, date_nanos_union_types
2146+
| EVAL a = nanos::date_nanos::datetime
2147+
| MV_EXPAND a
2148+
| SORT a, millis, nanos
2149+
| LIMIT 14
2150+
;
2151+
2152+
warningRegex:evaluation of \[FROM .*date_nanos.*date_nanos_union_types.*\] failed, treating result as null. Only first 20 failures recorded.
2153+
warningRegex:java.lang.IllegalArgumentException: milliSeconds \[-1457696696640\] are before the epoch in 1970 and cannot be converted to nanoseconds
2154+
2155+
millis:date_nanos | nanos:date_nanos | num:long | a:datetime
2156+
1999-10-23T12:15:03.360Z | [2023-01-23T13:55:01.543123456Z, 2023-02-23T13:33:34.937193Z, 2023-03-23T12:15:03.360103847Z] | 0 | 2023-01-23T13:55:01.543Z
2157+
1999-10-23T12:15:03.360103847Z | [2023-01-23T13:55:01.543Z, 2023-02-23T13:33:34.937Z, 2023-03-23T12:15:03.360Z] | 0 | 2023-01-23T13:55:01.543Z
2158+
1999-10-23T12:15:03.360Z | [2023-01-23T13:55:01.543123456Z, 2023-02-23T13:33:34.937193Z, 2023-03-23T12:15:03.360103847Z] | 0 | 2023-02-23T13:33:34.937Z
2159+
1999-10-23T12:15:03.360103847Z | [2023-01-23T13:55:01.543Z, 2023-02-23T13:33:34.937Z, 2023-03-23T12:15:03.360Z] | 0 | 2023-02-23T13:33:34.937Z
2160+
1999-10-22T12:15:03.360Z | [2023-03-23T12:15:03.360103847Z, 2023-03-23T12:15:03.360103847Z, 2023-03-23T12:15:03.360103847Z] | 0 | 2023-03-23T12:15:03.360Z
2161+
1999-10-22T12:15:03.360Z | [2023-03-23T12:15:03.360103847Z, 2023-03-23T12:15:03.360103847Z, 2023-03-23T12:15:03.360103847Z] | 0 | 2023-03-23T12:15:03.360Z
2162+
1999-10-22T12:15:03.360Z | [2023-03-23T12:15:03.360103847Z, 2023-03-23T12:15:03.360103847Z, 2023-03-23T12:15:03.360103847Z] | 0 | 2023-03-23T12:15:03.360Z
2163+
1999-10-22T12:15:03.360103847Z | [2023-03-23T12:15:03.360Z, 2023-03-23T12:15:03.360Z, 2023-03-23T12:15:03.360Z] | 0 | 2023-03-23T12:15:03.360Z
2164+
1999-10-22T12:15:03.360103847Z | [2023-03-23T12:15:03.360Z, 2023-03-23T12:15:03.360Z, 2023-03-23T12:15:03.360Z] | 0 | 2023-03-23T12:15:03.360Z
2165+
1999-10-22T12:15:03.360103847Z | [2023-03-23T12:15:03.360Z, 2023-03-23T12:15:03.360Z, 2023-03-23T12:15:03.360Z] | 0 | 2023-03-23T12:15:03.360Z
2166+
1999-10-23T12:15:03.360Z | [2023-01-23T13:55:01.543123456Z, 2023-02-23T13:33:34.937193Z, 2023-03-23T12:15:03.360103847Z] | 0 | 2023-03-23T12:15:03.360Z
2167+
1999-10-23T12:15:03.360103847Z | [2023-01-23T13:55:01.543Z, 2023-02-23T13:33:34.937Z, 2023-03-23T12:15:03.360Z] | 0 | 2023-03-23T12:15:03.360Z
2168+
2023-10-23T12:15:03.360Z | 2023-10-23T12:15:03.360103847Z | 1698063303360103847 | 2023-10-23T12:15:03.360Z
2169+
2023-10-23T12:15:03.360Z | 2023-10-23T12:15:03.360103847Z | 1698063303360103847 | 2023-10-23T12:15:03.360Z
21402170
;
21412171

21422172
ImplicitCastingMultiTypedMVFieldsEval

x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/analysis/Analyzer.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1690,9 +1690,10 @@ private Expression resolveConvertFunction(ConvertFunction convert, List<FieldAtt
16901690
&& fa.synthetic() == false // MultiTypeEsField in EsRelation created by DateMillisToNanosInEsRelation has synthetic = false
16911691
&& fa.field() instanceof MultiTypeEsField mtf) {
16921692
// This is an explicit casting of a union typed field that has been converted to MultiTypeEsField in EsRelation by
1693-
// DateMillisToNanosInEsRelation, it is not necessary to cast it again to the same type.
1693+
// DateMillisToNanosInEsRelation, it is not necessary to cast it again to the same type, replace the implicit casting
1694+
// with explicit casting.
16941695
if (((Expression) convert).dataType() == mtf.getDataType()) {
1695-
return fa;
1696+
return createIfDoesNotAlreadyExist(fa, mtf, unionFieldAttributes);
16961697
}
16971698

16981699
// Data type is different between implicit(date_nanos) and explicit casting, if the conversion is supported, create a

x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/AnalyzerTests.java

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4054,16 +4054,25 @@ public void testImplicitCastingForDateAndDateNanosFields() {
40544054
toDateNanos.field()
40554055
);
40564056
a = aliases.get(5); // f = date_and_date_nanos::date_nanos::datetime
4057-
verifyNameAndTypeAndMultiTypeEsField(a.name(), a.dataType(), "f", DATETIME, a.child());
4057+
verifyNameAndType(a.name(), a.dataType(), "f", DATETIME);
4058+
toDatetime = as(a.child(), ToDatetime.class);
4059+
fa = as(toDatetime.field(), FieldAttribute.class);
4060+
verifyNameAndTypeAndMultiTypeEsField(fa.name(), fa.dataType(), "$$date_and_date_nanos$converted_to$date_nanos", DATE_NANOS, fa);
40584061
a = aliases.get(6); // g = date_and_date_nanos::date_nanos::date_nanos
4059-
verifyNameAndTypeAndMultiTypeEsField(a.name(), a.dataType(), "g", DATE_NANOS, a.child());
4062+
verifyNameAndType(a.name(), a.dataType(), "g", DATE_NANOS);
4063+
toDateNanos = as(a.child(), ToDateNanos.class);
4064+
fa = as(toDateNanos.field(), FieldAttribute.class);
4065+
verifyNameAndTypeAndMultiTypeEsField(fa.name(), fa.dataType(), "$$date_and_date_nanos$converted_to$date_nanos", DATE_NANOS, fa);
40604066
a = aliases.get(7); // h = date_and_date_nanos::datetime::long
40614067
verifyNameAndType(a.name(), a.dataType(), "h", LONG);
40624068
ToLong toLong = as(a.child(), ToLong.class);
40634069
fa = as(toLong.field(), FieldAttribute.class);
40644070
verifyNameAndTypeAndMultiTypeEsField(fa.name(), fa.dataType(), "$$date_and_date_nanos$converted_to$datetime", DATETIME, fa);
40654071
a = aliases.get(8); // i = date_and_date_nanos::date_nanos::long
4066-
verifyNameAndTypeAndMultiTypeEsField(a.name(), a.dataType(), "i", LONG, a.child());
4072+
verifyNameAndType(a.name(), a.dataType(), "i", LONG);
4073+
toLong = as(a.child(), ToLong.class);
4074+
fa = as(toLong.field(), FieldAttribute.class);
4075+
verifyNameAndTypeAndMultiTypeEsField(fa.name(), fa.dataType(), "$$date_and_date_nanos$converted_to$date_nanos", DATE_NANOS, fa);
40674076
a = aliases.get(9); // j = date_and_date_nanos::long::datetime
40684077
verifyNameAndType(a.name(), a.dataType(), "j", DATETIME);
40694078
toDatetime = as(a.child(), ToDatetime.class);

0 commit comments

Comments
 (0)