This is an automated email from the ASF dual-hosted git repository.

jhyde 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 d3ab0bc8e4 [CALCITE-6150] JDBC adapter for ClickHouse generates 
incorrect SQL for certain units in the EXTRACT function
d3ab0bc8e4 is described below

commit d3ab0bc8e4d4c9ebc0fc4e33ce478d276f5d11e4
Author: chen768959 <[email protected]>
AuthorDate: Fri Dec 1 20:24:50 2023 +0800

    [CALCITE-6150] JDBC adapter for ClickHouse generates incorrect SQL for 
certain units in the EXTRACT function
    
    Close apache/calcite#3557
---
 .../calcite/sql/dialect/ClickHouseSqlDialect.java  | 23 ++++++++
 .../calcite/rel/rel2sql/RelToSqlConverterTest.java | 69 ++++++++++++++++++++++
 2 files changed, 92 insertions(+)

diff --git 
a/core/src/main/java/org/apache/calcite/sql/dialect/ClickHouseSqlDialect.java 
b/core/src/main/java/org/apache/calcite/sql/dialect/ClickHouseSqlDialect.java
index bd4b2a052c..802f562c3d 100644
--- 
a/core/src/main/java/org/apache/calcite/sql/dialect/ClickHouseSqlDialect.java
+++ 
b/core/src/main/java/org/apache/calcite/sql/dialect/ClickHouseSqlDialect.java
@@ -175,6 +175,29 @@ public class ClickHouseSqlDialect extends SqlDialect {
         super.unparseCall(writer, call, leftPrec, rightPrec);
       }
       break;
+    case EXTRACT:
+      SqlLiteral node = call.operand(0);
+      TimeUnitRange unit = node.getValueAs(TimeUnitRange.class);
+      String funName;
+      switch (unit) {
+      case DOW:
+        funName = "DAYOFWEEK";
+        break;
+      case DOY:
+        funName = "DAYOFYEAR";
+        break;
+      case WEEK:
+        funName = "toWeek";
+        break;
+      default:
+        super.unparseCall(writer, call, leftPrec, rightPrec);
+        return;
+      }
+      writer.print(funName);
+      final SqlWriter.Frame frame = writer.startList("(", ")");
+      call.operand(1).unparse(writer, 0, 0);
+      writer.endList(frame);
+      break;
     default:
       super.unparseCall(writer, call, leftPrec, rightPrec);
     }
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 79b6b0b983..8f10a1386a 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
@@ -2264,6 +2264,75 @@ class RelToSqlConverterTest {
     sql(query).withLibrary(SqlLibrary.BIG_QUERY).ok(expected);
   }
 
+  /** Test case for
+   * <a 
href="https://issues.apache.org/jira/browse/CALCITE-6150";>[CALCITE-6150]
+   * JDBC adapter for ClickHouse generates incorrect SQL for certain units in
+   * the EXTRACT function</a>. Also tests other units in other dialects. */
+  @Test void testExtract() {
+    final String sql = "SELECT\n"
+        + "EXTRACT(YEAR FROM DATE '2023-12-01'),\n"
+        + "EXTRACT(QUARTER FROM DATE '2023-12-01'),\n"
+        + "EXTRACT(MONTH FROM DATE '2023-12-01'),\n"
+        + "EXTRACT(WEEK FROM DATE '2023-12-01'),\n"
+        + "EXTRACT(DOY FROM DATE '2023-12-01'),\n"
+        + "EXTRACT(DAY FROM DATE '2023-12-01'),\n"
+        + "EXTRACT(DOW FROM DATE '2023-12-01'),\n"
+        + "EXTRACT(HOUR FROM TIMESTAMP '2023-12-01 00:00:00'),\n"
+        + "EXTRACT(MINUTE FROM TIMESTAMP '2023-12-01 00:00:00'),\n"
+        + "EXTRACT(SECOND FROM TIMESTAMP '2023-12-01 00:00:00')";
+    final String expectedClickHouse = "SELECT "
+        + "EXTRACT(YEAR FROM toDate('2023-12-01')), "
+        + "EXTRACT(QUARTER FROM toDate('2023-12-01')), "
+        + "EXTRACT(MONTH FROM toDate('2023-12-01')), "
+        + "toWeek(toDate('2023-12-01')), "
+        + "DAYOFYEAR(toDate('2023-12-01')), "
+        + "EXTRACT(DAY FROM toDate('2023-12-01')), "
+        + "DAYOFWEEK(toDate('2023-12-01')), "
+        + "EXTRACT(HOUR FROM toDateTime('2023-12-01 00:00:00')), "
+        + "EXTRACT(MINUTE FROM toDateTime('2023-12-01 00:00:00')), "
+        + "EXTRACT(SECOND FROM toDateTime('2023-12-01 00:00:00'))";
+    final String expectedHive = "SELECT "
+        + "EXTRACT(YEAR FROM DATE '2023-12-01'), "
+        + "EXTRACT(QUARTER FROM DATE '2023-12-01'), "
+        + "EXTRACT(MONTH FROM DATE '2023-12-01'), "
+        + "EXTRACT(WEEK FROM DATE '2023-12-01'), "
+        + "EXTRACT(DOY FROM DATE '2023-12-01'), "
+        + "EXTRACT(DAY FROM DATE '2023-12-01'), "
+        + "EXTRACT(DOW FROM DATE '2023-12-01'), "
+        + "EXTRACT(HOUR FROM TIMESTAMP '2023-12-01 00:00:00'), "
+        + "EXTRACT(MINUTE FROM TIMESTAMP '2023-12-01 00:00:00'), "
+        + "EXTRACT(SECOND FROM TIMESTAMP '2023-12-01 00:00:00')";
+    final String expectedPostgresql = "SELECT "
+        + "EXTRACT(YEAR FROM DATE '2023-12-01'), "
+        + "EXTRACT(QUARTER FROM DATE '2023-12-01'), "
+        + "EXTRACT(MONTH FROM DATE '2023-12-01'), "
+        + "EXTRACT(WEEK FROM DATE '2023-12-01'), "
+        + "EXTRACT(DOY FROM DATE '2023-12-01'), "
+        + "EXTRACT(DAY FROM DATE '2023-12-01'), "
+        + "EXTRACT(DOW FROM DATE '2023-12-01'), "
+        + "EXTRACT(HOUR FROM TIMESTAMP '2023-12-01 00:00:00'), "
+        + "EXTRACT(MINUTE FROM TIMESTAMP '2023-12-01 00:00:00'), "
+        + "EXTRACT(SECOND FROM TIMESTAMP '2023-12-01 00:00:00')\n"
+        + "FROM (VALUES (0)) AS \"t\" (\"ZERO\")";
+    final String expectedHsqldb = "SELECT "
+        + "EXTRACT(YEAR FROM DATE '2023-12-01'), "
+        + "EXTRACT(QUARTER FROM DATE '2023-12-01'), "
+        + "EXTRACT(MONTH FROM DATE '2023-12-01'), "
+        + "EXTRACT(WEEK FROM DATE '2023-12-01'), "
+        + "EXTRACT(DOY FROM DATE '2023-12-01'), "
+        + "EXTRACT(DAY FROM DATE '2023-12-01'), "
+        + "EXTRACT(DOW FROM DATE '2023-12-01'), "
+        + "EXTRACT(HOUR FROM TIMESTAMP '2023-12-01 00:00:00'), "
+        + "EXTRACT(MINUTE FROM TIMESTAMP '2023-12-01 00:00:00'), "
+        + "EXTRACT(SECOND FROM TIMESTAMP '2023-12-01 00:00:00')\n"
+        + "FROM (VALUES (0)) AS t (ZERO)";
+    sql(sql)
+        .withClickHouse().ok(expectedClickHouse)
+        .withHive().ok(expectedHive)
+        .withPostgresql().ok(expectedPostgresql)
+        .withHsqldb().ok(expectedHsqldb);
+  }
+
   /** Test case for
    * <a 
href="https://issues.apache.org/jira/browse/CALCITE-3220";>[CALCITE-3220]
    * HiveSqlDialect should transform the SQL-standard TRIM function to TRIM,

Reply via email to