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