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 1947312e4a [CALCITE-6482] Oracle dialect convert boolean literal when 
version < 23
1947312e4a is described below

commit 1947312e4ae792aa6ba6b4c48a2d868712d41dc5
Author: xiaohei <[email protected]>
AuthorDate: Tue Jul 23 20:33:41 2024 +0800

    [CALCITE-6482] Oracle dialect convert boolean literal when version < 23
---
 .../java/org/apache/calcite/sql/SqlDialect.java     |  7 +++++++
 .../java/org/apache/calcite/sql/SqlLiteral.java     |  3 +--
 .../calcite/sql/dialect/OracleSqlDialect.java       | 15 +++++++++++++++
 .../calcite/rel/rel2sql/RelToSqlConverterTest.java  | 21 +++++++++++++++++++++
 4 files changed, 44 insertions(+), 2 deletions(-)

diff --git a/core/src/main/java/org/apache/calcite/sql/SqlDialect.java 
b/core/src/main/java/org/apache/calcite/sql/SqlDialect.java
index b8877fdaf4..3d937581c5 100644
--- a/core/src/main/java/org/apache/calcite/sql/SqlDialect.java
+++ b/core/src/main/java/org/apache/calcite/sql/SqlDialect.java
@@ -466,6 +466,13 @@ public class SqlDialect {
     }
   }
 
+  public void unparseBoolLiteral(SqlWriter writer,
+      SqlLiteral literal, int leftPrec, int rightPrec) {
+    Object value = literal.getValue();
+    writer.keyword(
+        value == null ? "UNKNOWN" : (Boolean) value ? "TRUE" : "FALSE");
+  }
+
   public void unparseDateTimeLiteral(SqlWriter writer,
       SqlAbstractDateTimeLiteral literal, int leftPrec, int rightPrec) {
     writer.literal(literal.toString());
diff --git a/core/src/main/java/org/apache/calcite/sql/SqlLiteral.java 
b/core/src/main/java/org/apache/calcite/sql/SqlLiteral.java
index ae41cbe54e..272c0d135c 100644
--- a/core/src/main/java/org/apache/calcite/sql/SqlLiteral.java
+++ b/core/src/main/java/org/apache/calcite/sql/SqlLiteral.java
@@ -754,8 +754,7 @@ public class SqlLiteral extends SqlNode {
       int rightPrec) {
     switch (typeName) {
     case BOOLEAN:
-      writer.keyword(
-          value == null ? "UNKNOWN" : (Boolean) value ? "TRUE" : "FALSE");
+      writer.getDialect().unparseBoolLiteral(writer, this, leftPrec, 
rightPrec);
       break;
     case NULL:
       writer.keyword("NULL");
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 e99ab2a44f..4314438d6c 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
@@ -126,6 +126,21 @@ public class OracleSqlDialect extends SqlDialect {
     return false;
   }
 
+  @Override public void unparseBoolLiteral(SqlWriter writer,
+      SqlLiteral literal, int leftPrec, int rightPrec) {
+    Boolean value = (Boolean) literal.getValue();
+    if (value == null || majorVersion >= 23) {
+      super.unparseBoolLiteral(writer, literal, leftPrec, rightPrec);
+      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);
+  }
+
   @Override public void unparseDateTimeLiteral(SqlWriter writer,
       SqlAbstractDateTimeLiteral literal, int leftPrec, int rightPrec) {
     if (literal instanceof SqlTimestampLiteral) {
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 66e14e3745..af3e1bea6a 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
@@ -7753,6 +7753,27 @@ class RelToSqlConverterTest {
         .withOracle(11).throws_("Lower Oracle version(<12) doesn't support 
offset/fetch syntax!");
   }
 
+  /** Test case for
+   * <a 
href="https://issues.apache.org/jira/browse/CALCITE-6482";>[CALCITE-6482]
+   * Oracle dialect convert boolean literal when version < 23</a>. */
+  @Test void testBoolLiteralOracle() {
+    String query = "SELECT \"e1\".\"department_id\" "
+        + "FROM \"employee\" \"e1\""
+        + "LEFT JOIN \"employee\" \"e2\""
+        + "ON TRUE";
+    String expectedVersionLow = "SELECT \"employee\".\"department_id\"\n"
+        + "FROM \"foodmart\".\"employee\"\n"
+        + "LEFT JOIN \"foodmart\".\"employee\" \"employee0\" "
+        + "ON (1 = 1)";
+    String expectedVersionHigh = "SELECT \"employee\".\"department_id\"\n"
+        + "FROM \"foodmart\".\"employee\"\n"
+        + "LEFT JOIN \"foodmart\".\"employee\" \"employee0\" "
+        + "ON TRUE";
+    sql(query)
+        .withOracle(23).ok(expectedVersionHigh)
+        .withOracle(11).ok(expectedVersionLow);
+  }
+
   /** Test case for
    * <a 
href="https://issues.apache.org/jira/browse/CALCITE-5265";>[CALCITE-5265]
    * JDBC adapter sometimes adds unnecessary parentheses around SELECT in 
INSERT</a>. */

Reply via email to