diff --git a/x-pack/plugin/sql/qa/src/main/resources/datetime.csv-spec b/x-pack/plugin/sql/qa/src/main/resources/datetime.csv-spec index 39681e7118f..50df0f7dfe6 100644 --- a/x-pack/plugin/sql/qa/src/main/resources/datetime.csv-spec +++ b/x-pack/plugin/sql/qa/src/main/resources/datetime.csv-spec @@ -131,32 +131,32 @@ SELECT CONVERT(birth_date, DOUBLE) AS date FROM test_emp GROUP BY date ORDER BY date:d --------------- null --5.631552E8 --5.586624E8 --5.56416E8 --5.539104E8 --5.517504E8 --5.492448E8 --5.406912E8 --5.371488E8 --5.359392E8 +-5.631552E11 +-5.586624E11 +-5.56416E11 +-5.539104E11 +-5.517504E11 +-5.492448E11 +-5.406912E11 +-5.371488E11 +-5.359392E11 ; castedDateTimeWithGroupBy2 -SELECT CAST(hire_date AS INTEGER) AS date FROM test_emp GROUP BY date ORDER BY date LIMIT 10; +SELECT CAST(hire_date AS LONG) AS date FROM test_emp GROUP BY date ORDER BY date LIMIT 10; - date:i + date:l --------------- -477532800 -478051200 -484790400 -489715200 -495763200 -498096000 -498614400 -501206400 -501292800 -501379200 +477532800000 +478051200000 +484790400000 +489715200000 +495763200000 +498096000000 +498614400000 +501206400000 +501292800000 +501379200000 ; dateTimeAggByIsoDayOfWeekWithFilter diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/type/DataTypeConversion.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/type/DataTypeConversion.java index a578c6a7e06..bc89b0f1e15 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/type/DataTypeConversion.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/type/DataTypeConversion.java @@ -557,7 +557,7 @@ public abstract class DataTypeConversion { } private static Function fromDateTime(Function converter) { - return l -> converter.apply(((ZonedDateTime) l).toEpochSecond()); + return l -> converter.apply(((ZonedDateTime) l).toInstant().toEpochMilli()); } private static Function toDateTime(Conversion conversion) { diff --git a/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/type/DataTypeConversionTests.java b/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/type/DataTypeConversionTests.java index c42159bfaa3..546d276e4ce 100644 --- a/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/type/DataTypeConversionTests.java +++ b/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/type/DataTypeConversionTests.java @@ -99,14 +99,14 @@ public class DataTypeConversionTests extends ESTestCase { { Conversion conversion = conversionFor(DATE, to); assertNull(conversion.convert(null)); - assertEquals(123379200L, conversion.convert(DateUtils.asDateOnly(123456789101L))); - assertEquals(-123465600L, conversion.convert(DateUtils.asDateOnly(-123456789101L))); + assertEquals(123379200000L, conversion.convert(DateUtils.asDateOnly(123456789101L))); + assertEquals(-123465600000L, conversion.convert(DateUtils.asDateOnly(-123456789101L))); } { Conversion conversion = conversionFor(DATETIME, to); assertNull(conversion.convert(null)); - assertEquals(123456789L, conversion.convert(asDateTime(123456789101L))); - assertEquals(-123456790L, conversion.convert(asDateTime(-123456789101L))); + assertEquals(123456789101L, conversion.convert(asDateTime(123456789101L))); + assertEquals(-123456789101L, conversion.convert(asDateTime(-123456789101L))); } { Conversion conversion = conversionFor(KEYWORD, to); @@ -238,14 +238,14 @@ public class DataTypeConversionTests extends ESTestCase { { Conversion conversion = conversionFor(DATE, to); assertNull(conversion.convert(null)); - assertEquals(1.233792E8, (double) conversion.convert(DateUtils.asDateOnly(123456789101L)), 0); - assertEquals(-1.234656E8, (double) conversion.convert(DateUtils.asDateOnly(-123456789101L)), 0); + assertEquals(1.233792E11, (double) conversion.convert(DateUtils.asDateOnly(123456789101L)), 0); + assertEquals(-1.234656E11, (double) conversion.convert(DateUtils.asDateOnly(-123456789101L)), 0); } { Conversion conversion = conversionFor(DATETIME, to); assertNull(conversion.convert(null)); - assertEquals(1.23456789E8, (double) conversion.convert(asDateTime(123456789101L)), 0); - assertEquals(-1.2345679E8, (double) conversion.convert(asDateTime(-123456789101L)), 0); + assertEquals(1.23456789101E11, (double) conversion.convert(asDateTime(123456789101L)), 0); + assertEquals(-1.23456789101E11, (double) conversion.convert(asDateTime(-123456789101L)), 0); } { Conversion conversion = conversionFor(KEYWORD, to); @@ -340,20 +340,28 @@ public class DataTypeConversionTests extends ESTestCase { { Conversion conversion = conversionFor(DATE, to); assertNull(conversion.convert(null)); - assertEquals(123379200, conversion.convert(DateUtils.asDateOnly(123456789101L))); - assertEquals(-123465600, conversion.convert(DateUtils.asDateOnly(-123456789101L))); + assertEquals(0, conversion.convert(DateUtils.asDateOnly(12345678L))); + assertEquals(86400000, conversion.convert(DateUtils.asDateOnly(123456789L))); + assertEquals(172800000, conversion.convert(DateUtils.asDateOnly(223456789L))); + assertEquals(-172800000, conversion.convert(DateUtils.asDateOnly(-123456789L))); + Exception e = expectThrows(SqlIllegalArgumentException.class, () -> conversion.convert(DateUtils.asDateOnly(Long.MAX_VALUE))); + assertEquals("[9223372036828800000] out of [integer] range", e.getMessage()); } { Conversion conversion = conversionFor(DATETIME, to); assertNull(conversion.convert(null)); - assertEquals(123456789, conversion.convert(asDateTime(123456789101L))); - assertEquals(-123456790, conversion.convert(asDateTime(-123456789101L))); + assertEquals(12345678, conversion.convert(DateUtils.asDateTime(12345678L))); + assertEquals(223456789, conversion.convert(DateUtils.asDateTime(223456789L))); + assertEquals(-123456789, conversion.convert(DateUtils.asDateTime(-123456789L))); + Exception e = expectThrows(SqlIllegalArgumentException.class, () -> conversion.convert(DateUtils.asDateTime(Long.MAX_VALUE))); + assertEquals("[" + Long.MAX_VALUE + "] out of [integer] range", e.getMessage()); } } public void testConversionToShort() { + DataType to = SHORT; { - Conversion conversion = conversionFor(DOUBLE, SHORT); + Conversion conversion = conversionFor(DOUBLE, to); assertNull(conversion.convert(null)); assertEquals((short) 10, conversion.convert(10.0)); assertEquals((short) 10, conversion.convert(10.1)); @@ -361,11 +369,28 @@ public class DataTypeConversionTests extends ESTestCase { Exception e = expectThrows(SqlIllegalArgumentException.class, () -> conversion.convert(Integer.MAX_VALUE)); assertEquals("[" + Integer.MAX_VALUE + "] out of [short] range", e.getMessage()); } + { + Conversion conversion = conversionFor(DATE, to); + assertNull(conversion.convert(null)); + assertEquals((short) 0, conversion.convert(DateUtils.asDateOnly(12345678L))); + Exception e = expectThrows(SqlIllegalArgumentException.class, () -> conversion.convert(DateUtils.asDateOnly(123456789L))); + assertEquals("[86400000] out of [short] range", e.getMessage()); + } + { + Conversion conversion = conversionFor(DATETIME, to); + assertNull(conversion.convert(null)); + assertEquals((short) 12345, conversion.convert(DateUtils.asDateTime(12345L))); + assertEquals((short) -12345, conversion.convert(DateUtils.asDateTime(-12345L))); + Exception e = expectThrows(SqlIllegalArgumentException.class, + () -> conversion.convert(DateUtils.asDateTime(Integer.MAX_VALUE))); + assertEquals("[" + Integer.MAX_VALUE + "] out of [short] range", e.getMessage()); + } } public void testConversionToByte() { + DataType to = BYTE; { - Conversion conversion = conversionFor(DOUBLE, BYTE); + Conversion conversion = conversionFor(DOUBLE, to); assertNull(conversion.convert(null)); assertEquals((byte) 10, conversion.convert(10.0)); assertEquals((byte) 10, conversion.convert(10.1)); @@ -373,6 +398,22 @@ public class DataTypeConversionTests extends ESTestCase { Exception e = expectThrows(SqlIllegalArgumentException.class, () -> conversion.convert(Short.MAX_VALUE)); assertEquals("[" + Short.MAX_VALUE + "] out of [byte] range", e.getMessage()); } + { + Conversion conversion = conversionFor(DATE, to); + assertNull(conversion.convert(null)); + assertEquals((byte) 0, conversion.convert(DateUtils.asDateOnly(12345678L))); + Exception e = expectThrows(SqlIllegalArgumentException.class, () -> conversion.convert(DateUtils.asDateOnly(123456789L))); + assertEquals("[86400000] out of [byte] range", e.getMessage()); + } + { + Conversion conversion = conversionFor(DATETIME, to); + assertNull(conversion.convert(null)); + assertEquals((byte) 123, conversion.convert(DateUtils.asDateTime(123L))); + assertEquals((byte) -123, conversion.convert(DateUtils.asDateTime(-123L))); + Exception e = expectThrows(SqlIllegalArgumentException.class, + () -> conversion.convert(DateUtils.asDateTime(Integer.MAX_VALUE))); + assertEquals("[" + Integer.MAX_VALUE + "] out of [byte] range", e.getMessage()); + } } public void testConversionToNull() {