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>. */