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 &lt; &gt; 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>. */

Reply via email to