This is an automated email from the ASF dual-hosted git repository.
xiong 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 9a52add23e [CALCITE-6847] ClickHouse doesn't support TRUE/FALSE
keywords in its Join predicate
9a52add23e is described below
commit 9a52add23eef1c1e175e293e92160d479a7dde97
Author: xuyu <[email protected]>
AuthorDate: Wed Feb 19 22:00:55 2025 +0800
[CALCITE-6847] ClickHouse doesn't support TRUE/FALSE keywords in its Join
predicate
---
.../calcite/sql/dialect/ClickHouseSqlDialect.java | 11 +++++
.../calcite/rel/rel2sql/RelToSqlConverterTest.java | 50 +++++++++++++++++++---
2 files changed, 56 insertions(+), 5 deletions(-)
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 9fc3618924..ee692380f1 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
@@ -36,6 +36,8 @@
import org.checkerframework.checker.nullness.qual.Nullable;
+import static
org.apache.calcite.util.RelToSqlConverterUtil.unparseBoolLiteralToCondition;
+
import static java.util.Objects.requireNonNull;
/**
@@ -138,6 +140,15 @@ private static SqlDataTypeSpec
createSqlDataTypeSpecByName(String typeAlias,
writer.literal(toFunc + "('" + literal.toFormattedString() + "')");
}
+ @Override public void unparseBoolLiteral(SqlWriter writer, SqlLiteral
literal, int leftPrec,
+ int rightPrec) {
+ Boolean value = (Boolean) literal.getValue();
+ if (value == null) {
+ return;
+ }
+ unparseBoolLiteralToCondition(writer, value);
+ }
+
@Override public void unparseOffsetFetch(SqlWriter writer, @Nullable SqlNode
offset,
@Nullable SqlNode fetch) {
requireNonNull(fetch, "fetch");
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 1d9d3cfd40..6d59536d23 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
@@ -57,6 +57,7 @@
import org.apache.calcite.sql.dialect.AnsiSqlDialect;
import org.apache.calcite.sql.dialect.BigQuerySqlDialect;
import org.apache.calcite.sql.dialect.CalciteSqlDialect;
+import org.apache.calcite.sql.dialect.ClickHouseSqlDialect;
import org.apache.calcite.sql.dialect.HiveSqlDialect;
import org.apache.calcite.sql.dialect.JethroDataSqlDialect;
import org.apache.calcite.sql.dialect.MssqlSqlDialect;
@@ -8229,24 +8230,63 @@ private void checkLiteral2(String expression, String
expected) {
}
/** Test case for
- * <a
href="https://issues.apache.org/jira/browse/CALCITE-6819">[CALCITE-6819]
- * MSSQL doesn't support TRUE/FALSE keywords in its Join predicate</a>. */
- @Test void testJoinBoolLiteralMSSQL() {
+ * <a
href="https://issues.apache.org/jira/browse/CALCITE-6847">[CALCITE-6847]
+ * ClickHouse doesn't support TRUE/FALSE keywords in its Join predicate</a>.
*/
+ @Test void testJoinBoolLiteral() {
final String queryTrue = "SELECT \"hire_date\", \"department_description\"
FROM \"employee\" "
+ "LEFT JOIN \"department\" ON TRUE";
+ final String queryFalse = "SELECT \"hire_date\",
\"department_description\" FROM \"employee\" "
+ + "LEFT JOIN \"department\" ON False";
+
+ final String queryTrue1 = "SELECT \"hire_date\",
\"department_description\" FROM \"employee\" "
+ + "LEFT JOIN \"department\" ON 1 = 1";
+ final String queryFalse1 = "SELECT \"hire_date\",
\"department_description\" FROM \"employee\" "
+ + "LEFT JOIN \"department\" ON 1 = 0";
+
+ final String queryTrue2 = "select true from \"employee\"";
+ final String queryFalse2 = "select false from \"employee\"";
+
+ // mssql test
final String mssqlExpected1 = "SELECT [employee].[hire_date],"
+ " [department].[department_description]\nFROM
[foodmart].[employee]\nLEFT JOIN"
+ " [foodmart].[department] ON (1 = 1)";
sql(queryTrue)
.dialect(MssqlSqlDialect.DEFAULT).ok(mssqlExpected1);
+ sql(queryTrue1)
+ .dialect(MssqlSqlDialect.DEFAULT).ok(mssqlExpected1);
+
- final String queryFalse = "SELECT \"hire_date\",
\"department_description\" FROM \"employee\" "
- + "LEFT JOIN \"department\" ON False";
final String mssqlExpected2 = "SELECT [employee].[hire_date],"
+ " [department].[department_description]\nFROM
[foodmart].[employee]\nLEFT JOIN"
+ " [foodmart].[department] ON (1 = 0)";
sql(queryFalse)
.dialect(MssqlSqlDialect.DEFAULT).ok(mssqlExpected2);
+ sql(queryFalse1)
+ .dialect(MssqlSqlDialect.DEFAULT).ok(mssqlExpected2);
+
+ // clickhouse test
+ final String clickhouseExpected1 = "SELECT `employee`.`hire_date`,"
+ + " `department`.`department_description`\nFROM `foodmart`"
+ + ".`employee`\nLEFT JOIN"
+ + " `foodmart`.`department` ON (1 = 1)";
+ sql(queryTrue)
+ .dialect(ClickHouseSqlDialect.DEFAULT).ok(clickhouseExpected1);
+ sql(queryTrue1)
+ .dialect(ClickHouseSqlDialect.DEFAULT).ok(clickhouseExpected1);
+
+ final String clickhouseExpected2 = "SELECT `employee`.`hire_date`,"
+ + " `department`.`department_description`\nFROM `foodmart`"
+ + ".`employee`\nLEFT JOIN"
+ + " `foodmart`.`department` ON (1 = 0)";
+ sql(queryFalse)
+ .dialect(ClickHouseSqlDialect.DEFAULT).ok(clickhouseExpected2);
+ sql(queryFalse1)
+ .dialect(ClickHouseSqlDialect.DEFAULT).ok(clickhouseExpected2);
+
+ sql(queryTrue2).dialect(ClickHouseSqlDialect.DEFAULT)
+ .ok("SELECT (1 = 1)\nFROM `foodmart`.`employee`");
+ sql(queryFalse2).dialect(ClickHouseSqlDialect.DEFAULT)
+ .ok("SELECT (1 = 0)\nFROM `foodmart`.`employee`");
}
/** Test case for