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))";

Reply via email to