From aa076ab2f09469504aea6d31b02375616096ae8f Mon Sep 17 00:00:00 2001 From: Marios Trivyzas Date: Wed, 3 Apr 2019 13:28:30 +0200 Subject: [PATCH] SQL: Fix display size for DATE/DATETIME (#40669) A full format for a DATETIME would be: `2019-03-30T10:20:30.123+10:00` which is 29 chars long. For DATE a full format would be: `2019-03-30T00:00:00.000+10:00` which is also 29 chars long. (cherry picked from commit 6be83964ed025528778bca8d35692762e166983b) --- docs/reference/sql/functions/date-time.asciidoc | 4 ++++ 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 | 6 +++--- .../sql/plan/logical/command/sys/SysColumnsTests.java | 8 ++++---- .../org/elasticsearch/xpack/sql/type/TypesTests.java | 2 +- 7 files changed, 23 insertions(+), 14 deletions(-) diff --git a/docs/reference/sql/functions/date-time.asciidoc b/docs/reference/sql/functions/date-time.asciidoc index 47cdaa4924160..26e92ebc395b3 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.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 e59fd528fd80a..21f5193664d77 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 | based on <> | <> | text | VARCHAR | 2,147,483,647 | <> | binary | VARBINARY | 2,147,483,647 -| <> | datetime | TIMESTAMP | 24 +| <> | datetime | TIMESTAMP | 29 | <> | ip | VARCHAR | 39 4+h| Complex types @@ -65,7 +65,7 @@ s|SQL type s|SQL precision -| date | 24 +| 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 e346bfc649b23..547cf73131be4 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", 29); 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", 29); 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", 29); + + 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 f61d48af4ff37..f148dc9d3bb75 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', 0, 2147483647, null, null, 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', 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 f75d0a8f7352a..ec54b05c1ee9c 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, 0, false, false, false), - DATE( JDBCType.DATE, Long.BYTES, 24, 24, 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) + // the precision is 23 (number of chars in ISO8601 with millis) + 6 chars for the timezone (e.g.: +05:00) // see https://github.com/elastic/elasticsearch/issues/30386#issuecomment-386807288 - DATETIME( "date", JDBCType.TIMESTAMP, Long.BYTES, 24, 24, false, false, true), + DATE( JDBCType.DATE, Long.BYTES, 29, 29, false, false, true), + DATETIME( "date", JDBCType.TIMESTAMP, Long.BYTES, 29, 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 340e2acede248..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(24, 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(24, 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(24, precision(row)); + assertEquals(29, 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 +} diff --git a/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/type/TypesTests.java b/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/type/TypesTests.java index 2a2488dda722f..5cfc6bac113f9 100644 --- a/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/type/TypesTests.java +++ b/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/type/TypesTests.java @@ -81,7 +81,7 @@ public void testDateField() { EsField field = mapping.get("date"); assertThat(field.getDataType(), is(DATETIME)); assertThat(field.isAggregatable(), is(true)); - assertThat(field.getPrecision(), is(24)); + assertThat(field.getPrecision(), is(29)); } public void testDateNoFormat() {