This is an automated email from the ASF dual-hosted git repository.
zhehu 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 05841d726c [CALCITE-6761] StarRocks generates incorrect SQL for
certain units in the EXTRACT function
05841d726c is described below
commit 05841d726cc0d1a3507e4092d44ae7bc8257555f
Author: ClownXC <[email protected]>
AuthorDate: Sat Jan 4 10:13:10 2025 +0800
[CALCITE-6761] StarRocks generates incorrect SQL for certain units in the
EXTRACT function
---
.../calcite/sql/dialect/MysqlSqlDialect.java | 21 +++++++++++++++++++
.../calcite/rel/rel2sql/RelToSqlConverterTest.java | 24 ++++++++++++++++++++++
2 files changed, 45 insertions(+)
diff --git
a/core/src/main/java/org/apache/calcite/sql/dialect/MysqlSqlDialect.java
b/core/src/main/java/org/apache/calcite/sql/dialect/MysqlSqlDialect.java
index fc2a7a1b05..4119c68cc6 100644
--- a/core/src/main/java/org/apache/calcite/sql/dialect/MysqlSqlDialect.java
+++ b/core/src/main/java/org/apache/calcite/sql/dialect/MysqlSqlDialect.java
@@ -257,6 +257,27 @@ public class MysqlSqlDialect extends SqlDialect {
unparseListAggCall(writer, call, null, 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;
+ default:
+ super.unparseCall(writer, call, leftPrec, rightPrec);
+ return;
+ }
+ writer.print(funName);
+ final SqlWriter.Frame extractFrame = writer.startList("(", ")");
+ call.operand(1).unparse(writer, 0, 0);
+ writer.endList(extractFrame);
+ 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 9065ac7c46..f74cab5f16 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
@@ -2619,6 +2619,28 @@ class RelToSqlConverterTest {
+ "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 expectedMySQL = "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 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 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')";
final String expectedHive = "SELECT "
+ "EXTRACT(YEAR FROM DATE '2023-12-01'), "
+ "EXTRACT(QUARTER FROM DATE '2023-12-01'), "
@@ -2656,6 +2678,8 @@ class RelToSqlConverterTest {
+ "FROM (VALUES (0)) AS t (ZERO)";
sql(sql)
.withClickHouse().ok(expectedClickHouse)
+ .withMysql().ok(expectedMySQL)
+ .withStarRocks().ok(expectedStarRocks)
.withHive().ok(expectedHive)
.withPostgresql().ok(expectedPostgresql)
.withHsqldb().ok(expectedHsqldb);