Skip to content

Commit 68e93d1

Browse files
committed
SQL: Fix parsing of dates with milliseconds (#30419)
Dates internally contain milliseconds (which appear when converting them to Strings) however parsing does not accept them (and is being strict). The parser has been changed so that Date is mandatory but the time (including its fractions such as millis) are optional. Fix #30002
1 parent 4c7ac2a commit 68e93d1

File tree

2 files changed

+7
-2
lines changed

2 files changed

+7
-2
lines changed

x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/type/DataTypeConversion.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
*/
3232
public abstract class DataTypeConversion {
3333

34-
private static final DateTimeFormatter UTC_DATE_FORMATTER = ISODateTimeFormat.dateTimeNoMillis().withZoneUTC();
34+
private static final DateTimeFormatter UTC_DATE_FORMATTER = ISODateTimeFormat.dateOptionalTimeParser().withZoneUTC();
3535

3636
/**
3737
* Returns the type compatible with both left and right types

x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/type/DataTypeConversionTests.java

+6-1
Original file line numberDiff line numberDiff line change
@@ -82,10 +82,15 @@ public void testConversionToDate() {
8282
Conversion conversion = DataTypeConversion.conversionFor(DataType.KEYWORD, to);
8383
assertNull(conversion.convert(null));
8484

85-
// TODO we'd like to be able to optionally parse millis here I think....
8685
assertEquals(new DateTime(1000L, DateTimeZone.UTC), conversion.convert("1970-01-01T00:00:01Z"));
8786
assertEquals(new DateTime(1483228800000L, DateTimeZone.UTC), conversion.convert("2017-01-01T00:00:00Z"));
8887
assertEquals(new DateTime(18000000L, DateTimeZone.UTC), conversion.convert("1970-01-01T00:00:00-05:00"));
88+
89+
// double check back and forth conversion
90+
DateTime dt = DateTime.now(DateTimeZone.UTC);
91+
Conversion forward = DataTypeConversion.conversionFor(DataType.DATE, DataType.KEYWORD);
92+
Conversion back = DataTypeConversion.conversionFor(DataType.KEYWORD, DataType.DATE);
93+
assertEquals(dt, back.convert(forward.convert(dt)));
8994
Exception e = expectThrows(SqlIllegalArgumentException.class, () -> conversion.convert("0xff"));
9095
assertEquals("cannot cast [0xff] to [Date]:Invalid format: \"0xff\" is malformed at \"xff\"", e.getMessage());
9196
}

0 commit comments

Comments
 (0)