Skip to content

Commit 56db2a5

Browse files
more tests on invalid nanos valid millis
1 parent 1510069 commit 56db2a5

File tree

3 files changed

+36
-16
lines changed

3 files changed

+36
-16
lines changed

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

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2107,6 +2107,37 @@ millis:date_nanos | nanos:date_nanos | a:datetime
21072107
2023-10-23T12:15:03.360103847Z | 2023-10-23T12:15:03.360Z | 2023-10-23T12:15:03.360Z | 2023-10-23T12:15:03.360Z | 2023-10-23T12:15:03.360Z | 2023-10-23T12:15:03.360Z | 2023-10-23T12:15:03.360Z
21082108
;
21092109

2110+
ImplicitCastingMultiTypedFieldsInvalidNanosValidMillis
2111+
required_capability: date_nanos_type
2112+
required_capability: implicit_casting_date_and_date_nanos
2113+
2114+
FROM date_nanos, date_nanos_union_types
2115+
| EVAL a = nanos::datetime
2116+
| MV_EXPAND a
2117+
| KEEP a, millis, nanos
2118+
| SORT a, millis, nanos
2119+
| LIMIT 14
2120+
;
2121+
2122+
warningRegex:evaluation of \[FROM .*date_nanos.*date_nanos_union_types.*\] failed, treating result as null. Only first 20 failures recorded.
2123+
warningRegex:java.lang.IllegalArgumentException: milliSeconds \[-1457696696640\] are before the epoch in 1970 and cannot be converted to nanoseconds
2124+
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
2140+
;
21102141

21112142
ImplicitCastingMultiTypedMVFieldsEval
21122143
required_capability: date_nanos_type

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

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1690,11 +1690,9 @@ 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-
// ResolveUnionTypesInEsRelation, it is not necessary to cast it into date_nanos and then do explicit casting.
1693+
// DateMillisToNanosInEsRelation, it is not necessary to cast it again to the same type.
16941694
if (((Expression) convert).dataType() == mtf.getDataType()) {
1695-
// The same data type between implicit(date_nanos) and explicit casting, explicit conversion is not needed, mark is
1696-
// as synthetic = true as it is an explicit conversion
1697-
return createIfDoesNotAlreadyExist(fa, mtf, unionFieldAttributes);
1695+
return fa;
16981696
}
16991697

17001698
// 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: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4054,25 +4054,16 @@ public void testImplicitCastingForDateAndDateNanosFields() {
40544054
toDateNanos.field()
40554055
);
40564056
a = aliases.get(5); // f = date_and_date_nanos::date_nanos::datetime
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);
4057+
verifyNameAndTypeAndMultiTypeEsField(a.name(), a.dataType(), "f", DATETIME, a.child());
40614058
a = aliases.get(6); // g = date_and_date_nanos::date_nanos::date_nanos
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);
4059+
verifyNameAndTypeAndMultiTypeEsField(a.name(), a.dataType(), "g", DATE_NANOS, a.child());
40664060
a = aliases.get(7); // h = date_and_date_nanos::datetime::long
40674061
verifyNameAndType(a.name(), a.dataType(), "h", LONG);
40684062
ToLong toLong = as(a.child(), ToLong.class);
40694063
fa = as(toLong.field(), FieldAttribute.class);
40704064
verifyNameAndTypeAndMultiTypeEsField(fa.name(), fa.dataType(), "$$date_and_date_nanos$converted_to$datetime", DATETIME, fa);
40714065
a = aliases.get(8); // i = date_and_date_nanos::date_nanos::long
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);
4066+
verifyNameAndTypeAndMultiTypeEsField(a.name(), a.dataType(), "i", LONG, a.child());
40764067
a = aliases.get(9); // j = date_and_date_nanos::long::datetime
40774068
verifyNameAndType(a.name(), a.dataType(), "j", DATETIME);
40784069
toDatetime = as(a.child(), ToDatetime.class);

0 commit comments

Comments
 (0)