Skip to content

Commit

Permalink
SQL: Fix parsing of dates with milliseconds (#30419)
Browse files Browse the repository at this point in the history
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
  • Loading branch information
costin committed May 10, 2018
1 parent 4c7ac2a commit 68e93d1
Show file tree
Hide file tree
Showing 2 changed files with 7 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@
*/
public abstract class DataTypeConversion {

private static final DateTimeFormatter UTC_DATE_FORMATTER = ISODateTimeFormat.dateTimeNoMillis().withZoneUTC();
private static final DateTimeFormatter UTC_DATE_FORMATTER = ISODateTimeFormat.dateOptionalTimeParser().withZoneUTC();

/**
* Returns the type compatible with both left and right types
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -82,10 +82,15 @@ public void testConversionToDate() {
Conversion conversion = DataTypeConversion.conversionFor(DataType.KEYWORD, to);
assertNull(conversion.convert(null));

// TODO we'd like to be able to optionally parse millis here I think....
assertEquals(new DateTime(1000L, DateTimeZone.UTC), conversion.convert("1970-01-01T00:00:01Z"));
assertEquals(new DateTime(1483228800000L, DateTimeZone.UTC), conversion.convert("2017-01-01T00:00:00Z"));
assertEquals(new DateTime(18000000L, DateTimeZone.UTC), conversion.convert("1970-01-01T00:00:00-05:00"));

// double check back and forth conversion
DateTime dt = DateTime.now(DateTimeZone.UTC);
Conversion forward = DataTypeConversion.conversionFor(DataType.DATE, DataType.KEYWORD);
Conversion back = DataTypeConversion.conversionFor(DataType.KEYWORD, DataType.DATE);
assertEquals(dt, back.convert(forward.convert(dt)));
Exception e = expectThrows(SqlIllegalArgumentException.class, () -> conversion.convert("0xff"));
assertEquals("cannot cast [0xff] to [Date]:Invalid format: \"0xff\" is malformed at \"xff\"", e.getMessage());
}
Expand Down

0 comments on commit 68e93d1

Please sign in to comment.