This is an automated email from the ASF dual-hosted git repository.
jiajunxie pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/calcite.git
The following commit(s) were added to refs/heads/main by this push:
new 8556807787 [CALCITE-6121] Invalid unparse for TIMESTAMP with
SparkSqlDialect
8556807787 is described below
commit 8556807787bcde19bbfe05d040adf7c37784e97b
Author: Jiajun Xie <[email protected]>
AuthorDate: Sat Nov 18 17:04:42 2023 +0800
[CALCITE-6121] Invalid unparse for TIMESTAMP with SparkSqlDialect
---
.../main/java/org/apache/calcite/sql/SqlDialect.java | 14 ++++++++++++++
.../apache/calcite/sql/dialect/ExasolSqlDialect.java | 20 ++++----------------
.../apache/calcite/sql/dialect/PrestoSqlDialect.java | 4 ++++
.../apache/calcite/sql/dialect/SparkSqlDialect.java | 4 ++++
.../calcite/rel/rel2sql/RelToSqlConverterTest.java | 17 +++++++++++++++++
5 files changed, 43 insertions(+), 16 deletions(-)
diff --git a/core/src/main/java/org/apache/calcite/sql/SqlDialect.java
b/core/src/main/java/org/apache/calcite/sql/SqlDialect.java
index 5940485560..71157191e8 100644
--- a/core/src/main/java/org/apache/calcite/sql/SqlDialect.java
+++ b/core/src/main/java/org/apache/calcite/sql/SqlDialect.java
@@ -760,6 +760,13 @@ public class SqlDialect {
return false;
}
+ /**
+ * Returns whether this dialect supports TIMESTAMP with precision.
+ */
+ public boolean supportsTimestampPrecision() {
+ return true;
+ }
+
/** Returns whether this dialect supports the use of FILTER clauses for
* aggregate functions. e.g. {@code COUNT(*) FILTER (WHERE a = 2)}. */
public boolean supportsAggregateFunctionFilter() {
@@ -839,6 +846,13 @@ public class SqlDialect {
// if needed, adjust varchar length to max length supported by the
system
maxPrecision = getTypeSystem().getMaxPrecision(type.getSqlTypeName());
break;
+ case TIMESTAMP:
+ if (!supportsTimestampPrecision()) {
+ return new SqlDataTypeSpec(
+ new SqlBasicTypeNameSpec(type.getSqlTypeName(),
SqlParserPos.ZERO),
+ SqlParserPos.ZERO);
+ }
+ break;
default:
break;
}
diff --git
a/core/src/main/java/org/apache/calcite/sql/dialect/ExasolSqlDialect.java
b/core/src/main/java/org/apache/calcite/sql/dialect/ExasolSqlDialect.java
index 6e127cfc3d..e3122b41a1 100644
--- a/core/src/main/java/org/apache/calcite/sql/dialect/ExasolSqlDialect.java
+++ b/core/src/main/java/org/apache/calcite/sql/dialect/ExasolSqlDialect.java
@@ -16,15 +16,11 @@
*/
package org.apache.calcite.sql.dialect;
-import org.apache.calcite.rel.type.RelDataType;
-import org.apache.calcite.sql.SqlBasicTypeNameSpec;
import org.apache.calcite.sql.SqlCall;
-import org.apache.calcite.sql.SqlDataTypeSpec;
import org.apache.calcite.sql.SqlDialect;
import org.apache.calcite.sql.SqlKind;
import org.apache.calcite.sql.SqlNode;
import org.apache.calcite.sql.SqlWriter;
-import org.apache.calcite.sql.parser.SqlParserPos;
import com.google.common.collect.ImmutableList;
@@ -134,6 +130,10 @@ public class ExasolSqlDialect extends SqlDialect {
return false;
}
+ @Override public boolean supportsTimestampPrecision() {
+ return false;
+ }
+
@Override public boolean supportsAggregateFunction(SqlKind kind) {
switch (kind) {
case AVG:
@@ -158,18 +158,6 @@ public class ExasolSqlDialect extends SqlDialect {
|| RESERVED_KEYWORDS.contains(val.toUpperCase(Locale.ROOT));
}
- @Override public @Nullable SqlNode getCastSpec(RelDataType type) {
- switch (type.getSqlTypeName()) {
- case TIMESTAMP:
- // Exasol does not support TIMESTAMP with precision.
- return new SqlDataTypeSpec(
- new SqlBasicTypeNameSpec(type.getSqlTypeName(), SqlParserPos.ZERO),
- SqlParserPos.ZERO);
- default:
- return super.getCastSpec(type);
- }
- }
-
@Override public void unparseOffsetFetch(SqlWriter writer, @Nullable SqlNode
offset,
@Nullable SqlNode fetch) {
unparseFetchUsingLimit(writer, offset, fetch);
diff --git
a/core/src/main/java/org/apache/calcite/sql/dialect/PrestoSqlDialect.java
b/core/src/main/java/org/apache/calcite/sql/dialect/PrestoSqlDialect.java
index 75b232e349..4209fe77bf 100644
--- a/core/src/main/java/org/apache/calcite/sql/dialect/PrestoSqlDialect.java
+++ b/core/src/main/java/org/apache/calcite/sql/dialect/PrestoSqlDialect.java
@@ -64,6 +64,10 @@ public class PrestoSqlDialect extends SqlDialect {
return true;
}
+ @Override public boolean supportsTimestampPrecision() {
+ return false;
+ }
+
@Override public void unparseOffsetFetch(SqlWriter writer, @Nullable SqlNode
offset,
@Nullable SqlNode fetch) {
unparseUsingLimit(writer, offset, fetch);
diff --git
a/core/src/main/java/org/apache/calcite/sql/dialect/SparkSqlDialect.java
b/core/src/main/java/org/apache/calcite/sql/dialect/SparkSqlDialect.java
index e97cfcac01..f1f67fa35b 100644
--- a/core/src/main/java/org/apache/calcite/sql/dialect/SparkSqlDialect.java
+++ b/core/src/main/java/org/apache/calcite/sql/dialect/SparkSqlDialect.java
@@ -104,6 +104,10 @@ public class SparkSqlDialect extends SqlDialect {
return true;
}
+ @Override public boolean supportsTimestampPrecision() {
+ return false;
+ }
+
@Override public void unparseOffsetFetch(SqlWriter writer, @Nullable SqlNode
offset,
@Nullable SqlNode fetch) {
unparseFetchUsingLimit(writer, offset, fetch);
diff --git
a/core/src/test/java/org/apache/calcite/rel/rel2sql/RelToSqlConverterTest.java
b/core/src/test/java/org/apache/calcite/rel/rel2sql/RelToSqlConverterTest.java
index b73cc8016c..1578d0112e 100644
---
a/core/src/test/java/org/apache/calcite/rel/rel2sql/RelToSqlConverterTest.java
+++
b/core/src/test/java/org/apache/calcite/rel/rel2sql/RelToSqlConverterTest.java
@@ -2415,6 +2415,23 @@ class RelToSqlConverterTest {
.withRedshift().ok(expectedRedshift);
}
+ /** Test case for
+ * <a
href="https://issues.apache.org/jira/browse/CALCITE-6121">[CALCITE-6121]
+ * Invalid unparse for TIMESTAMP with SparkSqlDialect</a>. */
+ @Test void testCastToTimestampWithoutPrecision() {
+ final String query = "select * from \"employee\" where \"hire_date\" - "
+ + "INTERVAL '19800' SECOND(5) > cast(\"hire_date\" as TIMESTAMP(0))";
+ final String expectedSpark = "SELECT *\n"
+ + "FROM foodmart.employee\n"
+ + "WHERE (hire_date - INTERVAL '19800' SECOND(5)) > CAST(hire_date AS
TIMESTAMP)";
+ final String expectedPresto = "SELECT *\n"
+ + "FROM \"foodmart\".\"employee\"\n"
+ + "WHERE (\"hire_date\" - INTERVAL '19800' SECOND) >
CAST(\"hire_date\" AS TIMESTAMP)";
+ sql(query)
+ .withSpark().ok(expectedSpark)
+ .withPresto().ok(expectedPresto);
+ }
+
@Test void testExasolCastToTimestamp() {
final String query = "select * from \"employee\" where \"hire_date\" - "
+ "INTERVAL '19800' SECOND(5) > cast(\"hire_date\" as TIMESTAMP(0))";