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 e9c28c64f3 [CALCITE-6949] ClickHouse not support floor date to
SECOND/MILLISECOND/MICROSECOND/NANOSECOND
e9c28c64f3 is described below
commit e9c28c64f32ef1f4dfa394325b9e141a026adb1c
Author: Yu Xu <[email protected]>
AuthorDate: Wed Apr 9 10:58:28 2025 +0800
[CALCITE-6949] ClickHouse not support floor date to
SECOND/MILLISECOND/MICROSECOND/NANOSECOND
---
.../calcite/sql/dialect/ClickHouseSqlDialect.java | 12 +++++
.../calcite/rel/rel2sql/RelToSqlConverterTest.java | 55 ++++++++++++++++++++++
2 files changed, 67 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 dcba521a57..96bff7ad05 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
@@ -313,6 +313,18 @@ private static void unparseFloor(SqlWriter writer, SqlCall
call) {
case MINUTE:
funName = "toStartOfMinute";
break;
+ case SECOND:
+ funName = "toStartOfSecond";
+ break;
+ case MILLISECOND:
+ funName = "toStartOfMillisecond";
+ break;
+ case MICROSECOND:
+ funName = "toStartOfMicrosecond";
+ break;
+ case NANOSECOND:
+ funName = "toStartOfNanosecond";
+ break;
default:
throw new RuntimeException("ClickHouse does not support FLOOR for time
unit: "
+ unit);
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 188806ceb9..81b971009b 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
@@ -5355,6 +5355,61 @@ private void checkLiteral2(String expression, String
expected) {
.withMysql().ok(expectedMysql);
}
+ /** Test case for
+ * <a
href="https://issues.apache.org/jira/browse/CALCITE-6949">[CALCITE-6949]
+ * ClickHouse not support floor date to
SECOND/MILLISECOND/MICROSECOND/NANOSECOND</a>. */
+ @Test void testFloorClickHouse() {
+ String query = "SELECT floor(\"hire_date\" TO YEAR) FROM \"employee\"";
+ String expectedClickHouse = "SELECT toStartOfYear(`hire_date`)\n"
+ + "FROM `foodmart`.`employee`";
+ sql(query).withClickHouse().ok(expectedClickHouse);
+
+ String query1 = "SELECT floor(\"hire_date\" TO MONTH) FROM \"employee\"";
+ String expectedClickHouse1 = "SELECT toStartOfMonth(`hire_date`)\n"
+ + "FROM `foodmart`.`employee`";
+ sql(query1).withClickHouse().ok(expectedClickHouse1);
+
+ String query2 = "SELECT floor(\"hire_date\" TO WEEK) FROM \"employee\"";
+ String expectedClickHouse2 = "SELECT toMonday(`hire_date`)\n"
+ + "FROM `foodmart`.`employee`";
+ sql(query2).withClickHouse().ok(expectedClickHouse2);
+
+ String query3 = "SELECT floor(\"hire_date\" TO DAY) FROM \"employee\"";
+ String expectedClickHouse3 = "SELECT toDate(`hire_date`)\n"
+ + "FROM `foodmart`.`employee`";
+ sql(query3).withClickHouse().ok(expectedClickHouse3);
+
+ String query4 = "SELECT floor(\"hire_date\" TO HOUR) FROM \"employee\"";
+ String expectedClickHouse4 = "SELECT toStartOfHour(`hire_date`)\n"
+ + "FROM `foodmart`.`employee`";
+ sql(query4).withClickHouse().ok(expectedClickHouse4);
+
+ String query5 = "SELECT floor(\"hire_date\" TO MINUTE) FROM \"employee\"";
+ String expectedClickHouse5 = "SELECT toStartOfMinute(`hire_date`)\n"
+ + "FROM `foodmart`.`employee`";
+ sql(query5).withClickHouse().ok(expectedClickHouse5);
+
+ String query6 = "SELECT floor(\"hire_date\" TO SECOND) FROM \"employee\"";
+ String expectedClickHouse6 = "SELECT toStartOfSecond(`hire_date`)\n"
+ + "FROM `foodmart`.`employee`";
+ sql(query6).withClickHouse().ok(expectedClickHouse6);
+
+ String query7 = "SELECT floor(\"hire_date\" TO MILLISECOND) FROM
\"employee\"";
+ String expectedClickHouse7 = "SELECT toStartOfMillisecond(`hire_date`)\n"
+ + "FROM `foodmart`.`employee`";
+ sql(query7).withClickHouse().ok(expectedClickHouse7);
+
+ String query8 = "SELECT floor(\"hire_date\" TO MICROSECOND) FROM
\"employee\"";
+ String expectedClickHouse8 = "SELECT toStartOfMicrosecond(`hire_date`)\n"
+ + "FROM `foodmart`.`employee`";
+ sql(query8).withClickHouse().ok(expectedClickHouse8);
+
+ String query9 = "SELECT floor(\"hire_date\" TO NANOSECOND) FROM
\"employee\"";
+ String expectedClickHouse9 = "SELECT toStartOfNanosecond(`hire_date`)\n"
+ + "FROM `foodmart`.`employee`";
+ sql(query9).withClickHouse().ok(expectedClickHouse9);
+ }
+
@Test void testUnparseSqlIntervalQualifierDb2() {
String queryDatePlus = "select * from \"employee\" where \"hire_date\" +
"
+ "INTERVAL '19800' SECOND(5) > TIMESTAMP '2005-10-17 00:00:00' ";