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

mbudiu 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 cc3a4b7db3 [CALCITE-7096] Invalid unparse for EXTRACT in 
StarRocks/Doris
cc3a4b7db3 is described below

commit cc3a4b7db3eb92f6ca3f952bd914a8ec0ed51818
Author: xuzifu666 <[email protected]>
AuthorDate: Wed Jul 16 12:20:24 2025 +0800

    [CALCITE-7096] Invalid unparse for EXTRACT in StarRocks/Doris
---
 .../calcite/sql/dialect/DorisSqlDialect.java       |  9 -------
 .../calcite/sql/dialect/StarRocksSqlDialect.java   | 22 ++++++++++++++++
 .../calcite/rel/rel2sql/RelToSqlConverterTest.java | 29 ++++++++++++----------
 3 files changed, 38 insertions(+), 22 deletions(-)

diff --git 
a/core/src/main/java/org/apache/calcite/sql/dialect/DorisSqlDialect.java 
b/core/src/main/java/org/apache/calcite/sql/dialect/DorisSqlDialect.java
index 25ac43a485..7d4e27901d 100644
--- a/core/src/main/java/org/apache/calcite/sql/dialect/DorisSqlDialect.java
+++ b/core/src/main/java/org/apache/calcite/sql/dialect/DorisSqlDialect.java
@@ -55,15 +55,6 @@ public DorisSqlDialect(Context context) {
               timeUnitNode.getParserPosition());
       SqlFloorFunction.unparseDatetimeFunction(writer, newCall, "DATE_TRUNC", 
true);
       break;
-    case EXTRACT:
-      writer.print(call.getOperator().getName());
-      final SqlWriter.Frame extractFrame = writer.startList("(", ")");
-      call.operand(0).unparse(writer, 0, 0);
-      writer.sep("FROM");
-      String value = ((SqlLiteral) call.operand(1)).toValue();
-      writer.print("'" + value + "'");
-      writer.endList(extractFrame);
-      break;
     default:
       super.unparseCall(writer, call, leftPrec, rightPrec);
       break;
diff --git 
a/core/src/main/java/org/apache/calcite/sql/dialect/StarRocksSqlDialect.java 
b/core/src/main/java/org/apache/calcite/sql/dialect/StarRocksSqlDialect.java
index cce51df6f0..d7031666fe 100644
--- a/core/src/main/java/org/apache/calcite/sql/dialect/StarRocksSqlDialect.java
+++ b/core/src/main/java/org/apache/calcite/sql/dialect/StarRocksSqlDialect.java
@@ -136,6 +136,28 @@ public StarRocksSqlDialect(Context context) {
     case TRIM:
       unparseHiveTrim(writer, call, leftPrec, rightPrec);
       break;
+    case EXTRACT:
+      writer.print(call.getOperator().getName());
+      final SqlWriter.Frame extractFrame = writer.startList("(", ")");
+      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;
+      default:
+        funName = unit.name();
+      }
+      writer.print(funName);
+      writer.print(" FROM ");
+      String value = ((SqlLiteral) call.operand(1)).toValue();
+      writer.print("'" + value + "'");
+      writer.endList(extractFrame);
+      break;
     case FLOOR:
       if (call.operandCount() != 2) {
         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 7234f7a3c4..9476302cd8 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
@@ -2849,7 +2849,10 @@ private SqlDialect nonOrdinalDialect() {
   /** 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. */
+   * the EXTRACT function</a>. Also tests other units in other dialects,
+   * <a 
href="https://issues.apache.org/jira/browse/CALCITE-7096";>[CALCITE-7096]
+   * Invalid unparse for EXTRACT in StarRocks/Doris</a>.
+   * */
   @Test void testExtract() {
     final String sql = "SELECT\n"
         + "EXTRACT(YEAR FROM DATE '2023-12-01'),\n"
@@ -2885,16 +2888,16 @@ private SqlDialect nonOrdinalDialect() {
         + "EXTRACT(MINUTE FROM TIMESTAMP '2023-12-01 00:00:00'), "
         + "EXTRACT(SECOND FROM TIMESTAMP '2023-12-01 00:00:00')";
     final String expectedStarRocks = "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'), "
-        + "DAYOFYEAR(DATE '2023-12-01'), "
-        + "EXTRACT(DAY FROM DATE '2023-12-01'), "
-        + "DAYOFWEEK(DATE '2023-12-01'), "
-        + "EXTRACT(HOUR FROM DATETIME '2023-12-01 00:00:00'), "
-        + "EXTRACT(MINUTE FROM DATETIME '2023-12-01 00:00:00'), "
-        + "EXTRACT(SECOND FROM DATETIME '2023-12-01 00:00:00')";
+        + "EXTRACT(YEAR FROM '2023-12-01'), "
+        + "EXTRACT(QUARTER FROM '2023-12-01'), "
+        + "EXTRACT(MONTH FROM '2023-12-01'), "
+        + "EXTRACT(WEEK FROM '2023-12-01'), "
+        + "EXTRACT(DAYOFYEAR FROM '2023-12-01'), "
+        + "EXTRACT(DAY FROM '2023-12-01'), "
+        + "EXTRACT(DAYOFWEEK FROM '2023-12-01'), "
+        + "EXTRACT(HOUR FROM '2023-12-01 00:00:00'), "
+        + "EXTRACT(MINUTE FROM '2023-12-01 00:00:00'), "
+        + "EXTRACT(SECOND FROM '2023-12-01 00:00:00')";
     final String expectedHive = "SELECT "
         + "EXTRACT(YEAR FROM DATE '2023-12-01'), "
         + "EXTRACT(QUARTER FROM DATE '2023-12-01'), "
@@ -2935,9 +2938,9 @@ private SqlDialect nonOrdinalDialect() {
             + "EXTRACT(QUARTER FROM '2023-12-01'), "
             + "EXTRACT(MONTH FROM '2023-12-01'), "
             + "EXTRACT(WEEK FROM '2023-12-01'), "
-            + "EXTRACT(DOY FROM '2023-12-01'), "
+            + "EXTRACT(DAYOFYEAR FROM '2023-12-01'), "
             + "EXTRACT(DAY FROM '2023-12-01'), "
-            + "EXTRACT(DOW FROM '2023-12-01'), "
+            + "EXTRACT(DAYOFWEEK FROM '2023-12-01'), "
             + "EXTRACT(HOUR FROM '2023-12-01 00:00:00'), "
             + "EXTRACT(MINUTE FROM '2023-12-01 00:00:00'), "
             + "EXTRACT(SECOND FROM '2023-12-01 00:00:00')";

Reply via email to