From 6d3a81de13322a79f83d07b86fb427bdf2087fed Mon Sep 17 00:00:00 2001 From: Mihai Budiu Date: Fri, 23 Feb 2024 07:25:40 -0800 Subject: [PATCH] [CALCITE-6138] Parser does not accept TIMESTAMP WITH TIME ZONE as a data type Signed-off-by: Mihai Budiu --- .../adapter/cassandra/CassandraFilter.java | 4 + core/src/main/codegen/templates/Parser.jj | 46 +++++------ .../adapter/enumerable/RexImpTable.java | 6 ++ .../calcite/jdbc/JavaTypeFactoryImpl.java | 2 + .../calcite/rel/metadata/RelMdSize.java | 4 + .../calcite/rel/rules/DateRangeRules.java | 16 +++- .../MaterializedViewAggregateRule.java | 3 +- .../rel/type/RelDataTypeSystemImpl.java | 8 ++ .../org/apache/calcite/rex/RexBuilder.java | 62 +++++++++++++++ .../org/apache/calcite/rex/RexLiteral.java | 33 +++++++- .../sql/SqlAbstractDateTimeLiteral.java | 2 +- .../calcite/sql/SqlBasicTypeNameSpec.java | 27 +++++-- .../calcite/sql/SqlJdbcDataTypeName.java | 2 + .../org/apache/calcite/sql/SqlLiteral.java | 21 +++++ .../apache/calcite/sql/SqlTimeTzLiteral.java | 70 +++++++++++++++++ .../calcite/sql/SqlTimestampLiteral.java | 2 +- .../calcite/sql/SqlTimestampTzLiteral.java | 70 +++++++++++++++++ .../apache/calcite/sql/SqlUnknownLiteral.java | 4 + .../calcite/sql/parser/SqlParserUtil.java | 49 ++++++++++++ .../apache/calcite/sql/type/ReturnTypes.java | 7 ++ .../sql/type/SqlTypeAssignmentRule.java | 6 ++ .../calcite/sql/type/SqlTypeCoercionRule.java | 45 +++++++++++ .../calcite/sql/type/SqlTypeFamily.java | 8 +- .../apache/calcite/sql/type/SqlTypeName.java | 27 +++++-- .../sql2rel/SqlNodeToRexConverterImpl.java | 5 ++ .../calcite/util/TimeWithTimeZoneString.java | 6 ++ .../apache/calcite/util/TimestampString.java | 5 ++ .../util/TimestampWithTimeZoneString.java | 9 +++ .../java/org/apache/calcite/util/Util.java | 10 ++- .../calcite/jdbc/CalciteRemoteDriverTest.java | 2 +- .../apache/calcite/rex/RexBuilderTest.java | 78 ++++++++++++++++++- .../calcite/sql/type/SqlTypeFactoryTest.java | 2 + .../apache/calcite/test/SqlValidatorTest.java | 11 +++ site/_docs/reference.md | 6 +- .../calcite/sql/parser/SqlParserTest.java | 17 ++-- 35 files changed, 614 insertions(+), 61 deletions(-) create mode 100644 core/src/main/java/org/apache/calcite/sql/SqlTimeTzLiteral.java create mode 100644 core/src/main/java/org/apache/calcite/sql/SqlTimestampTzLiteral.java diff --git a/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraFilter.java b/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraFilter.java index aeb749a6d288..117c79a99c72 100644 --- a/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraFilter.java +++ b/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraFilter.java @@ -36,6 +36,7 @@ import org.apache.calcite.sql.type.SqlTypeName; import org.apache.calcite.util.DateString; import org.apache.calcite.util.TimestampString; +import org.apache.calcite.util.TimestampWithTimeZoneString; import org.apache.calcite.util.Util; import org.checkerframework.checker.nullness.qual.Nullable; @@ -192,6 +193,9 @@ private String translateMatch(RexNode condition) { private static Object literalValue(RexLiteral literal) { Comparable value = RexLiteral.value(literal); switch (literal.getTypeName()) { + case TIMESTAMP_TZ: + assert value instanceof TimestampWithTimeZoneString; + return value.toString(); case TIMESTAMP: case TIMESTAMP_WITH_LOCAL_TIME_ZONE: assert value instanceof TimestampString; diff --git a/core/src/main/codegen/templates/Parser.jj b/core/src/main/codegen/templates/Parser.jj index 78f9f590edd1..542b164e1810 100644 --- a/core/src/main/codegen/templates/Parser.jj +++ b/core/src/main/codegen/templates/Parser.jj @@ -4787,6 +4787,7 @@ SqlLiteral DateTimeLiteral() : { final String p; final Span s; + boolean local = false; } { { @@ -4818,6 +4819,7 @@ SqlLiteral DateTimeLiteral() : return SqlLiteral.createUnknown("DATETIME", p, s.end(this)); } | + LOOKAHEAD(2)