From c4b10b6d2f6a70f42fb0025044be53ae83635986 Mon Sep 17 00:00:00 2001 From: Marios Trivyzas Date: Sat, 30 Mar 2019 16:10:42 +0100 Subject: [PATCH 1/3] SQL: Fix displa size for DATE/DATETIME A full format for a DATETIME would be: `2019-03-30T10:20:30.123456789+10:00` (example when asking for `current_timestamp(9)`) which is 35 chars long. For DATE a full format would be: `2019-03-30T00:00:00.000+10:00` which is 29 chars long. --- docs/reference/sql/language/data-types.asciidoc | 4 ++-- .../xpack/sql/qa/SqlProtocolTestCase.java | 11 ++++++++--- .../resources/setup_mock_metadata_get_columns.sql | 2 +- .../org/elasticsearch/xpack/sql/type/DataType.java | 4 ++-- .../sql/plan/logical/command/sys/SysColumnsTests.java | 8 ++++---- 5 files changed, 17 insertions(+), 12 deletions(-) diff --git a/docs/reference/sql/language/data-types.asciidoc b/docs/reference/sql/language/data-types.asciidoc index 42e5c842a4187..179fdd8c77c77 100644 --- a/docs/reference/sql/language/data-types.asciidoc +++ b/docs/reference/sql/language/data-types.asciidoc @@ -26,7 +26,7 @@ s|SQL precision | <> | keyword | VARCHAR | 32,766 | <> | text | VARCHAR | 2,147,483,647 | <> | binary | VARBINARY | 2,147,483,647 -| <> | datetime | TIMESTAMP | 24 +| <> | datetime | TIMESTAMP | 35 | <> | ip | VARCHAR | 39 4+h| Complex types @@ -65,7 +65,7 @@ s|SQL type s|SQL precision -| date | 24 +| date | 35 | interval_year | 7 | interval_month | 7 | interval_day | 23 diff --git a/x-pack/plugin/sql/qa/src/main/java/org/elasticsearch/xpack/sql/qa/SqlProtocolTestCase.java b/x-pack/plugin/sql/qa/src/main/java/org/elasticsearch/xpack/sql/qa/SqlProtocolTestCase.java index 1a47bb0add85b..8193ff6339b16 100644 --- a/x-pack/plugin/sql/qa/src/main/java/org/elasticsearch/xpack/sql/qa/SqlProtocolTestCase.java +++ b/x-pack/plugin/sql/qa/src/main/java/org/elasticsearch/xpack/sql/qa/SqlProtocolTestCase.java @@ -67,11 +67,16 @@ public void testTextualType() throws IOException { public void testDateTimes() throws IOException { assertQuery("SELECT CAST('2019-01-14T12:29:25.000Z' AS DATETIME)", "CAST('2019-01-14T12:29:25.000Z' AS DATETIME)", - "datetime", "2019-01-14T12:29:25.000Z", 24); + "datetime", "2019-01-14T12:29:25.000Z", 35); assertQuery("SELECT CAST(-26853765751000 AS DATETIME)", "CAST(-26853765751000 AS DATETIME)", - "datetime", "1119-01-15T12:37:29.000Z", 24); + "datetime", "1119-01-15T12:37:29.000Z", 35); assertQuery("SELECT CAST(CAST('-26853765751000' AS BIGINT) AS DATETIME)", "CAST(CAST('-26853765751000' AS BIGINT) AS DATETIME)", - "datetime", "1119-01-15T12:37:29.000Z", 24); + "datetime", "1119-01-15T12:37:29.000Z", 35); + + assertQuery("SELECT CAST('2019-01-14' AS DATE)", "CAST('2019-01-14' AS DATE)", + "date", "2019-01-14T00:00:00.000Z", 29); + assertQuery("SELECT CAST(-26853765751000 AS DATE)", "CAST(-26853765751000 AS DATE)", + "date", "1119-01-15T00:00:00.000Z", 29); } public void testIPs() throws IOException { diff --git a/x-pack/plugin/sql/qa/src/main/resources/setup_mock_metadata_get_columns.sql b/x-pack/plugin/sql/qa/src/main/resources/setup_mock_metadata_get_columns.sql index 6292a6296ff69..ca6c1dc7f6ed9 100644 --- a/x-pack/plugin/sql/qa/src/main/resources/setup_mock_metadata_get_columns.sql +++ b/x-pack/plugin/sql/qa/src/main/resources/setup_mock_metadata_get_columns.sql @@ -33,7 +33,7 @@ SELECT null, 'test1', 'name.keyword', 12, 'KEYWORD', 32766, 2147483647, null, nu null, null, 12, 0, 2147483647, 1, 'YES', null, null, null, null, 'NO', 'NO' FROM DUAL UNION ALL -SELECT null, 'test2', 'date', 93, 'DATETIME', 24, 8, null, null, +SELECT null, 'test2', 'date', 93, 'DATETIME', 35, 8, null, null, 1, -- columnNullable null, null, 9, 3, null, 1, 'YES', null, null, null, null, 'NO', 'NO' FROM DUAL diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/type/DataType.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/type/DataType.java index deeeed1c1ca16..e43734cc8788e 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/type/DataType.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/type/DataType.java @@ -44,11 +44,11 @@ public enum DataType { OBJECT( "object", JDBCType.STRUCT, -1, 0, 0, false, false, false), NESTED( "nested", JDBCType.STRUCT, -1, 0, 0, false, false, false), BINARY( "binary", JDBCType.VARBINARY, -1, Integer.MAX_VALUE, Integer.MAX_VALUE, false, false, false), - DATE( JDBCType.DATE, Long.BYTES, 24, 24, false, false, true), + DATE( JDBCType.DATE, Long.BYTES, 3, 29, false, false, true), // since ODBC and JDBC interpret precision for Date as display size // the precision is 23 (number of chars in ISO8601 with millis) + Z (the UTC timezone) // see https://github.com/elastic/elasticsearch/issues/30386#issuecomment-386807288 - DATETIME( "date", JDBCType.TIMESTAMP, Long.BYTES, 3, 24, false, false, true), + DATETIME( "date", JDBCType.TIMESTAMP, Long.BYTES, 3, 35, false, false, true), // // specialized types // diff --git a/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/plan/logical/command/sys/SysColumnsTests.java b/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/plan/logical/command/sys/SysColumnsTests.java index 340e2acede248..b9fc6e08c54ea 100644 --- a/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/plan/logical/command/sys/SysColumnsTests.java +++ b/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/plan/logical/command/sys/SysColumnsTests.java @@ -50,7 +50,7 @@ public void testSysColumns() { assertEquals("date", name(row)); assertEquals(Types.TIMESTAMP, sqlType(row)); assertEquals(null, radix(row)); - assertEquals(24, precision(row)); + assertEquals(35, precision(row)); assertEquals(8, bufferLength(row)); row = rows.get(5); @@ -173,7 +173,7 @@ public void testSysColumnsInOdbcMode() { assertEquals("date", name(row)); assertEquals((short) Types.TIMESTAMP, sqlType(row)); assertEquals(null, radix(row)); - assertEquals(24, precision(row)); + assertEquals(35, precision(row)); assertEquals(8, bufferLength(row)); assertNull(decimalPrecision(row)); assertEquals(Short.class, nullable(row).getClass()); @@ -308,7 +308,7 @@ public void testSysColumnsInJdbcMode() { assertEquals("date", name(row)); assertEquals(Types.TIMESTAMP, sqlType(row)); assertEquals(null, radix(row)); - assertEquals(24, precision(row)); + assertEquals(35, precision(row)); assertEquals(8, bufferLength(row)); assertNull(decimalPrecision(row)); assertEquals(Integer.class, nullable(row).getClass()); @@ -431,4 +431,4 @@ private static Object sqlDataType(List list) { private static Object sqlDataTypeSub(List list) { return list.get(14); } -} \ No newline at end of file +} From 86b7423a69fd25d5cc3ae977f15526150bf541a4 Mon Sep 17 00:00:00 2001 From: Marios Trivyzas Date: Mon, 1 Apr 2019 18:13:46 +0200 Subject: [PATCH 2/3] Remove 6 digits from precision. Currently we only display down to millis. --- docs/reference/sql/functions/date-time.asciidoc | 4 ++++ docs/reference/sql/language/data-types.asciidoc | 4 ++-- .../elasticsearch/xpack/sql/qa/SqlProtocolTestCase.java | 8 +++++--- .../main/resources/setup_mock_metadata_get_columns.sql | 2 +- .../java/org/elasticsearch/xpack/sql/type/DataType.java | 2 +- .../sql/plan/logical/command/sys/SysColumnsTests.java | 6 +++--- 6 files changed, 16 insertions(+), 10 deletions(-) diff --git a/docs/reference/sql/functions/date-time.asciidoc b/docs/reference/sql/functions/date-time.asciidoc index f3060d81b3ffc..3334db5b10753 100644 --- a/docs/reference/sql/functions/date-time.asciidoc +++ b/docs/reference/sql/functions/date-time.asciidoc @@ -187,6 +187,10 @@ relative date/time filtering: include-tagged::{sql-specs}/docs/docs.csv-spec[filterNow] -------------------------------------------------- +[IMPORTANT] +Currently, Using a _precision_ greater than 3 doesn't make any difference to the output of the +function as the maximum number of second fractional digits returned is 3 (milliseconds). + [[sql-functions-datetime-day]] ==== `DAY_OF_MONTH/DOM/DAY` diff --git a/docs/reference/sql/language/data-types.asciidoc b/docs/reference/sql/language/data-types.asciidoc index 179fdd8c77c77..0854e324cf1da 100644 --- a/docs/reference/sql/language/data-types.asciidoc +++ b/docs/reference/sql/language/data-types.asciidoc @@ -26,7 +26,7 @@ s|SQL precision | <> | keyword | VARCHAR | 32,766 | <> | text | VARCHAR | 2,147,483,647 | <> | binary | VARBINARY | 2,147,483,647 -| <> | datetime | TIMESTAMP | 35 +| <> | datetime | TIMESTAMP | 29 | <> | ip | VARCHAR | 39 4+h| Complex types @@ -65,7 +65,7 @@ s|SQL type s|SQL precision -| date | 35 +| date | 29 | interval_year | 7 | interval_month | 7 | interval_day | 23 diff --git a/x-pack/plugin/sql/qa/src/main/java/org/elasticsearch/xpack/sql/qa/SqlProtocolTestCase.java b/x-pack/plugin/sql/qa/src/main/java/org/elasticsearch/xpack/sql/qa/SqlProtocolTestCase.java index 8193ff6339b16..95172b7c77c1a 100644 --- a/x-pack/plugin/sql/qa/src/main/java/org/elasticsearch/xpack/sql/qa/SqlProtocolTestCase.java +++ b/x-pack/plugin/sql/qa/src/main/java/org/elasticsearch/xpack/sql/qa/SqlProtocolTestCase.java @@ -67,11 +67,13 @@ public void testTextualType() throws IOException { public void testDateTimes() throws IOException { assertQuery("SELECT CAST('2019-01-14T12:29:25.000Z' AS DATETIME)", "CAST('2019-01-14T12:29:25.000Z' AS DATETIME)", - "datetime", "2019-01-14T12:29:25.000Z", 35); + "datetime", "2019-01-14T12:29:25.000Z", 29); + assertQuery("SELECT CAST('2019-01-14T12:29:25.000+05:00' AS DATETIME)", "CAST('2019-01-14T12:29:25.000+05:00' AS DATETIME)", + "datetime", "2019-01-14T12:29:25.000+05:00", 29); assertQuery("SELECT CAST(-26853765751000 AS DATETIME)", "CAST(-26853765751000 AS DATETIME)", - "datetime", "1119-01-15T12:37:29.000Z", 35); + "datetime", "1119-01-15T12:37:29.000Z", 29); assertQuery("SELECT CAST(CAST('-26853765751000' AS BIGINT) AS DATETIME)", "CAST(CAST('-26853765751000' AS BIGINT) AS DATETIME)", - "datetime", "1119-01-15T12:37:29.000Z", 35); + "datetime", "1119-01-15T12:37:29.000Z", 29); assertQuery("SELECT CAST('2019-01-14' AS DATE)", "CAST('2019-01-14' AS DATE)", "date", "2019-01-14T00:00:00.000Z", 29); diff --git a/x-pack/plugin/sql/qa/src/main/resources/setup_mock_metadata_get_columns.sql b/x-pack/plugin/sql/qa/src/main/resources/setup_mock_metadata_get_columns.sql index ca6c1dc7f6ed9..d6df2fbb9e14b 100644 --- a/x-pack/plugin/sql/qa/src/main/resources/setup_mock_metadata_get_columns.sql +++ b/x-pack/plugin/sql/qa/src/main/resources/setup_mock_metadata_get_columns.sql @@ -33,7 +33,7 @@ SELECT null, 'test1', 'name.keyword', 12, 'KEYWORD', 32766, 2147483647, null, nu null, null, 12, 0, 2147483647, 1, 'YES', null, null, null, null, 'NO', 'NO' FROM DUAL UNION ALL -SELECT null, 'test2', 'date', 93, 'DATETIME', 35, 8, null, null, +SELECT null, 'test2', 'date', 93, 'DATETIME', 29, 8, null, null, 1, -- columnNullable null, null, 9, 3, null, 1, 'YES', null, null, null, null, 'NO', 'NO' FROM DUAL diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/type/DataType.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/type/DataType.java index e43734cc8788e..42caebbaa68f6 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/type/DataType.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/type/DataType.java @@ -48,7 +48,7 @@ public enum DataType { // since ODBC and JDBC interpret precision for Date as display size // the precision is 23 (number of chars in ISO8601 with millis) + Z (the UTC timezone) // see https://github.com/elastic/elasticsearch/issues/30386#issuecomment-386807288 - DATETIME( "date", JDBCType.TIMESTAMP, Long.BYTES, 3, 35, false, false, true), + DATETIME( "date", JDBCType.TIMESTAMP, Long.BYTES, 3, 29, false, false, true), // // specialized types // diff --git a/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/plan/logical/command/sys/SysColumnsTests.java b/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/plan/logical/command/sys/SysColumnsTests.java index b9fc6e08c54ea..5d3e9d8a771b9 100644 --- a/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/plan/logical/command/sys/SysColumnsTests.java +++ b/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/plan/logical/command/sys/SysColumnsTests.java @@ -50,7 +50,7 @@ public void testSysColumns() { assertEquals("date", name(row)); assertEquals(Types.TIMESTAMP, sqlType(row)); assertEquals(null, radix(row)); - assertEquals(35, precision(row)); + assertEquals(29, precision(row)); assertEquals(8, bufferLength(row)); row = rows.get(5); @@ -173,7 +173,7 @@ public void testSysColumnsInOdbcMode() { assertEquals("date", name(row)); assertEquals((short) Types.TIMESTAMP, sqlType(row)); assertEquals(null, radix(row)); - assertEquals(35, precision(row)); + assertEquals(29, precision(row)); assertEquals(8, bufferLength(row)); assertNull(decimalPrecision(row)); assertEquals(Short.class, nullable(row).getClass()); @@ -308,7 +308,7 @@ public void testSysColumnsInJdbcMode() { assertEquals("date", name(row)); assertEquals(Types.TIMESTAMP, sqlType(row)); assertEquals(null, radix(row)); - assertEquals(35, precision(row)); + assertEquals(29, precision(row)); assertEquals(8, bufferLength(row)); assertNull(decimalPrecision(row)); assertEquals(Integer.class, nullable(row).getClass()); From 06b36eb7e2987ac2898a2711b0e8e1353573d1d1 Mon Sep 17 00:00:00 2001 From: Marios Trivyzas Date: Mon, 1 Apr 2019 18:34:39 +0200 Subject: [PATCH 3/3] Fix test --- .../org/elasticsearch/xpack/sql/qa/SqlProtocolTestCase.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/x-pack/plugin/sql/qa/src/main/java/org/elasticsearch/xpack/sql/qa/SqlProtocolTestCase.java b/x-pack/plugin/sql/qa/src/main/java/org/elasticsearch/xpack/sql/qa/SqlProtocolTestCase.java index 95172b7c77c1a..f34911f65bbb5 100644 --- a/x-pack/plugin/sql/qa/src/main/java/org/elasticsearch/xpack/sql/qa/SqlProtocolTestCase.java +++ b/x-pack/plugin/sql/qa/src/main/java/org/elasticsearch/xpack/sql/qa/SqlProtocolTestCase.java @@ -68,8 +68,6 @@ public void testTextualType() throws IOException { public void testDateTimes() throws IOException { assertQuery("SELECT CAST('2019-01-14T12:29:25.000Z' AS DATETIME)", "CAST('2019-01-14T12:29:25.000Z' AS DATETIME)", "datetime", "2019-01-14T12:29:25.000Z", 29); - assertQuery("SELECT CAST('2019-01-14T12:29:25.000+05:00' AS DATETIME)", "CAST('2019-01-14T12:29:25.000+05:00' AS DATETIME)", - "datetime", "2019-01-14T12:29:25.000+05:00", 29); assertQuery("SELECT CAST(-26853765751000 AS DATETIME)", "CAST(-26853765751000 AS DATETIME)", "datetime", "1119-01-15T12:37:29.000Z", 29); assertQuery("SELECT CAST(CAST('-26853765751000' AS BIGINT) AS DATETIME)", "CAST(CAST('-26853765751000' AS BIGINT) AS DATETIME)",