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 dd49d9f735 [CALCITE-6819] MSSQL doesn't support TRUE/FALSE keywords in
its Join predicate
dd49d9f735 is described below
commit dd49d9f7357c6f1ce34fdcdb765637a970d80eef
Author: Sreeharsha Ramanavarapu <[email protected]>
AuthorDate: Wed Feb 12 10:24:05 2025 -0500
[CALCITE-6819] MSSQL doesn't support TRUE/FALSE keywords in its Join
predicate
In MSSQL dialect use 1=1 instead of TRUE
---
.../apache/calcite/sql/dialect/MssqlSqlDialect.java | 11 +++++++++++
.../calcite/sql/dialect/OracleSqlDialect.java | 8 +++-----
.../apache/calcite/util/RelToSqlConverterUtil.java | 15 +++++++++++++++
.../calcite/rel/rel2sql/RelToSqlConverterTest.java | 21 +++++++++++++++++++++
4 files changed, 50 insertions(+), 5 deletions(-)
diff --git
a/core/src/main/java/org/apache/calcite/sql/dialect/MssqlSqlDialect.java
b/core/src/main/java/org/apache/calcite/sql/dialect/MssqlSqlDialect.java
index 126d9f1e16..712f6d898f 100644
--- a/core/src/main/java/org/apache/calcite/sql/dialect/MssqlSqlDialect.java
+++ b/core/src/main/java/org/apache/calcite/sql/dialect/MssqlSqlDialect.java
@@ -45,6 +45,8 @@
import org.checkerframework.checker.nullness.qual.Nullable;
+import static
org.apache.calcite.util.RelToSqlConverterUtil.unparseBoolLiteralToCondition;
+
import static java.util.Objects.requireNonNull;
/**
@@ -189,6 +191,15 @@ public MssqlSqlDialect(Context context) {
}
}
+ @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 boolean supportsCharSet() {
return false;
}
diff --git
a/core/src/main/java/org/apache/calcite/sql/dialect/OracleSqlDialect.java
b/core/src/main/java/org/apache/calcite/sql/dialect/OracleSqlDialect.java
index 5856288057..2de588f118 100644
--- a/core/src/main/java/org/apache/calcite/sql/dialect/OracleSqlDialect.java
+++ b/core/src/main/java/org/apache/calcite/sql/dialect/OracleSqlDialect.java
@@ -45,6 +45,8 @@
import java.util.List;
+import static
org.apache.calcite.util.RelToSqlConverterUtil.unparseBoolLiteralToCondition;
+
/**
* A <code>SqlDialect</code> implementation for the Oracle database.
*/
@@ -139,11 +141,7 @@ public OracleSqlDialect(Context context) {
return;
}
// low version oracle not support bool literal
- final SqlWriter.Frame frame = writer.startList("(", ")");
- writer.literal("1");
- writer.sep(SqlStdOperatorTable.EQUALS.getName());
- writer.literal(value ? "1" : "0");
- writer.endList(frame);
+ unparseBoolLiteralToCondition(writer, value);
}
@Override public void unparseDateTimeLiteral(SqlWriter writer,
diff --git
a/core/src/main/java/org/apache/calcite/util/RelToSqlConverterUtil.java
b/core/src/main/java/org/apache/calcite/util/RelToSqlConverterUtil.java
index 6b510e4141..80e234abc1 100644
--- a/core/src/main/java/org/apache/calcite/util/RelToSqlConverterUtil.java
+++ b/core/src/main/java/org/apache/calcite/util/RelToSqlConverterUtil.java
@@ -23,6 +23,7 @@
import org.apache.calcite.sql.SqlNode;
import org.apache.calcite.sql.SqlSpecialOperator;
import org.apache.calcite.sql.SqlWriter;
+import org.apache.calcite.sql.fun.SqlStdOperatorTable;
import org.apache.calcite.sql.fun.SqlTrimFunction;
import org.apache.calcite.sql.parser.SqlParserPos;
@@ -196,4 +197,18 @@ public static SqlSpecialOperator
specialOperatorByName(String opName) {
}
};
}
+
+ /**
+ * Writes TRUE/FALSE or 1 = 1/ 1 < > 1 for certain.
+ *
+ * @param writer current SqlWriter object
+ * @param value boolean value to be unparsed.
+ */
+ public static void unparseBoolLiteralToCondition(SqlWriter writer, boolean
value) {
+ final SqlWriter.Frame frame = writer.startList("(", ")");
+ writer.literal("1");
+ writer.sep(SqlStdOperatorTable.EQUALS.getName());
+ writer.literal(value ? "1" : "0");
+ writer.endList(frame);
+ }
}
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 44330c7988..661e14d07f 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
@@ -8229,6 +8229,27 @@ private void checkLiteral2(String expression, String
expected) {
.withOracle(11).ok(expectedVersionLow);
}
+ /** 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() {
+ final String queryTrue = "SELECT \"hire_date\", \"department_description\"
FROM \"employee\" "
+ + "LEFT JOIN \"department\" ON TRUE";
+ 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);
+
+ 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);
+ }
+
/** Test case for
* <a
href="https://issues.apache.org/jira/browse/CALCITE-6480">[CALCITE-6480]
* OracleDialect does not support CASE WHEN returning boolean</a>. */