SQL: Fix casting from date to numeric type to use millis (#37869)

Previously casting from a DATE[TIME] type to a numeric (DOUBLE, LONG,
INT, etc. used seconds instead of the epoch millis.

Fixes: #37655
This commit is contained in:
Marios Trivyzas 2019-01-25 23:29:10 +02:00 committed by GitHub
parent eb7bf16427
commit d1ff450edc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 77 additions and 36 deletions

View File

@ -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

View File

@ -557,7 +557,7 @@ public abstract class DataTypeConversion {
}
private static Function<Object, Object> fromDateTime(Function<Long, Object> converter) {
return l -> converter.apply(((ZonedDateTime) l).toEpochSecond());
return l -> converter.apply(((ZonedDateTime) l).toInstant().toEpochMilli());
}
private static Function<Object, Object> toDateTime(Conversion conversion) {

View File

@ -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() {