This is an automated email from the ASF dual-hosted git repository. ppa pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/ignite-3.git
The following commit(s) were added to refs/heads/main by this push: new d11c50bc48 IGNITE-19371 Sql. Prevent the user from using the TIME(STAMP)_WITH_LOCAL_TIME_ZONE types (#1990) d11c50bc48 is described below commit d11c50bc48bad404d8c5608c245292443596d17f Author: Pavel Pereslegin <xxt...@gmail.com> AuthorDate: Tue May 2 23:17:20 2023 +0300 IGNITE-19371 Sql. Prevent the user from using the TIME(STAMP)_WITH_LOCAL_TIME_ZONE types (#1990) --- .../ignite/internal/sql/engine/ItMetadataTest.java | 21 +++++++++----- modules/sql-engine/src/main/codegen/config.fmpp | 1 + .../src/main/codegen/includes/parserImpls.ftl | 32 ++++++++++++++++++++++ .../internal/sql/engine/sql/SqlDdlParserTest.java | 16 +++++++++++ 4 files changed, 63 insertions(+), 7 deletions(-) diff --git a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItMetadataTest.java b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItMetadataTest.java index 96a480b108..42e112427e 100644 --- a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItMetadataTest.java +++ b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItMetadataTest.java @@ -129,9 +129,14 @@ public class ItMetadataTest extends ClusterPerClassIntegrationTest { // Datetime types // ANSI`99 syntax "WITH TIME ZONE" is not supported, // a "WITH LOCAL TIME ZONE" syntax MUST be used instead. - + "DATE_C DATE, " + "TIME_C TIME, " + "TIME_C2 TIME(9), " + "TIME_LTZ_C TIME WITH LOCAL TIME ZONE, " - + "TIME_LTZ_C2 TIME(9) WITH LOCAL TIME ZONE, " + "DATETIME_C TIMESTAMP, " + "DATETIME_C2 TIMESTAMP(9), " - + "TIMESTAMP_C TIMESTAMP WITH LOCAL TIME ZONE, " + "TIMESTAMP_C2 TIMESTAMP(9) WITH LOCAL TIME ZONE, " + + "DATE_C DATE, " + "TIME_C TIME, " + "TIME_C2 TIME(9), " + // TODO: IGNITE-19274 Ignite doesn't support the client's time zone yet. + // + "TIME_LTZ_C TIME WITH LOCAL TIME ZONE, " + // + "TIME_LTZ_C2 TIME(9) WITH LOCAL TIME ZONE, " + + "DATETIME_C TIMESTAMP, " + "DATETIME_C2 TIMESTAMP(9), " + // TODO: IGNITE-19274 Ignite doesn't support the client's time zone yet. + // + "TIMESTAMP_C TIMESTAMP WITH LOCAL TIME ZONE, " + // + "TIMESTAMP_C2 TIMESTAMP(9) WITH LOCAL TIME ZONE, " // Interval types // TODO: IGNITE-17373: Ignite doesn't support interval types yet. @@ -190,12 +195,14 @@ public class ItMetadataTest extends ClusterPerClassIntegrationTest { new MetadataMatcher().name("DATE_C").type(ColumnType.DATE).precision(0).scale(UNDEFINED_SCALE), new MetadataMatcher().name("TIME_C").type(ColumnType.TIME).precision(0).scale(UNDEFINED_SCALE), new MetadataMatcher().name("TIME_C2").type(ColumnType.TIME).precision(9).scale(UNDEFINED_SCALE), - new MetadataMatcher().name("TIME_LTZ_C").type(ColumnType.TIME).precision(0).scale(UNDEFINED_SCALE), - new MetadataMatcher().name("TIME_LTZ_C2").type(ColumnType.TIME).precision(9).scale(UNDEFINED_SCALE), + // TODO: IGNITE-19274 Ignite doesn't support the client's time zone yet. + // new MetadataMatcher().name("TIME_LTZ_C").type(ColumnType.TIME).precision(0).scale(UNDEFINED_SCALE), + // new MetadataMatcher().name("TIME_LTZ_C2").type(ColumnType.TIME).precision(9).scale(UNDEFINED_SCALE), new MetadataMatcher().name("DATETIME_C").type(ColumnType.DATETIME).precision(6).scale(UNDEFINED_SCALE), new MetadataMatcher().name("DATETIME_C2").type(ColumnType.DATETIME).precision(9).scale(UNDEFINED_SCALE), - new MetadataMatcher().name("TIMESTAMP_C").type(ColumnType.TIMESTAMP).precision(6).scale(UNDEFINED_SCALE), - new MetadataMatcher().name("TIMESTAMP_C2").type(ColumnType.TIMESTAMP).precision(9).scale(UNDEFINED_SCALE), + // TODO: IGNITE-19274 Ignite doesn't support the client's time zone yet. + // new MetadataMatcher().name("TIMESTAMP_C").type(ColumnType.TIMESTAMP).precision(6).scale(UNDEFINED_SCALE), + // new MetadataMatcher().name("TIMESTAMP_C2").type(ColumnType.TIMESTAMP).precision(9).scale(UNDEFINED_SCALE), // Interval types // TODO: IGNITE-17373: Ignite doesn't support interval types yet. diff --git a/modules/sql-engine/src/main/codegen/config.fmpp b/modules/sql-engine/src/main/codegen/config.fmpp index a8bcd96d22..57b6c37062 100644 --- a/modules/sql-engine/src/main/codegen/config.fmpp +++ b/modules/sql-engine/src/main/codegen/config.fmpp @@ -630,6 +630,7 @@ data: { # Example: SqlParseTimeStampZ(). dataTypeParserMethods: [ "UuidType(s)", + "IgniteDateTimeTypeName()" ] # Binary operators tokens. diff --git a/modules/sql-engine/src/main/codegen/includes/parserImpls.ftl b/modules/sql-engine/src/main/codegen/includes/parserImpls.ftl index d5397216be..ebac86bb61 100644 --- a/modules/sql-engine/src/main/codegen/includes/parserImpls.ftl +++ b/modules/sql-engine/src/main/codegen/includes/parserImpls.ftl @@ -560,3 +560,35 @@ SqlLiteral ParseDecimalLiteral(): return IgniteSqlDecimalLiteral.create(value, getPos()); } } + +/** +* Parse datetime types: date, time, timestamp. +* +* TODO Method doesn't recognize '*_WITH_LOCAL_TIME_ZONE' types and should be removed after IGNITE-19274. +*/ +SqlTypeNameSpec IgniteDateTimeTypeName() : +{ + int precision = -1; + SqlTypeName typeName; + final Span s; +} +{ + <DATE> { + typeName = SqlTypeName.DATE; + return new SqlBasicTypeNameSpec(typeName, getPos()); + } +| + <TIME> { s = span(); } + precision = PrecisionOpt() + { + typeName = SqlTypeName.TIME; + return new SqlBasicTypeNameSpec(typeName, precision, s.end(this)); + } +| + <TIMESTAMP> { s = span(); } + precision = PrecisionOpt() + { + typeName = SqlTypeName.TIMESTAMP; + return new SqlBasicTypeNameSpec(typeName, precision, s.end(this)); + } +} diff --git a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/sql/SqlDdlParserTest.java b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/sql/SqlDdlParserTest.java index f6832e3787..371870623b 100644 --- a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/sql/SqlDdlParserTest.java +++ b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/sql/SqlDdlParserTest.java @@ -31,6 +31,7 @@ import static org.junit.jupiter.api.Assertions.assertThrows; import java.util.List; import java.util.Objects; import java.util.Set; +import java.util.function.Consumer; import java.util.stream.Collectors; import org.apache.calcite.sql.SqlBasicCall; import org.apache.calcite.sql.SqlIdentifier; @@ -504,6 +505,21 @@ public class SqlDdlParserTest extends AbstractDdlParserTest { assertThat(dropIndex.indexName().names, is(List.of("MY_INDEX"))); } + /** + * Ensures that the user cannot use the TIME_WITH_LOCAL_TIME_ZONE and TIMESTAMP_WITH_LOCAL_TIME_ZONE types for table columns. + */ + // TODO: Remove after https://issues.apache.org/jira/browse/IGNITE-19274 is implemented. + @Test + public void timestampWithLocalTimeZoneIsNotSupported() { + Consumer<String> checker = (query) -> { + var ex = assertThrows(SqlException.class, () -> parse(query)); + assertThat(ex.getMessage(), containsString("Encountered \" \"WITH\"")); + }; + + checker.accept("CREATE TABLE test (ts TIMESTAMP WITH LOCAL TIME ZONE)"); + checker.accept("CREATE TABLE test (ts TIME WITH LOCAL TIME ZONE)"); + } + private IgniteSqlCreateTable parseCreateTable(String stmt) { SqlNode node = parse(stmt);