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 412ac801eb [CALCITE-7005] Invalid unparse for IS TRUE,IS FALSE,IS NOT 
TRUE and IS NOT FALSE in Hive/Presto Dialect
412ac801eb is described below

commit 412ac801ebc9484521ec469661c71011ad0ef9b9
Author: Yu Xu <[email protected]>
AuthorDate: Fri May 9 18:58:33 2025 +0800

    [CALCITE-7005] Invalid unparse for IS TRUE,IS FALSE,IS NOT TRUE and IS NOT 
FALSE in Hive/Presto Dialect
---
 .../apache/calcite/sql/dialect/HiveSqlDialect.java |  5 +++
 .../calcite/sql/dialect/PrestoSqlDialect.java      | 15 +++++++
 .../calcite/rel/rel2sql/RelToSqlConverterTest.java | 49 +++++++++++++++++++++-
 3 files changed, 68 insertions(+), 1 deletion(-)

diff --git 
a/core/src/main/java/org/apache/calcite/sql/dialect/HiveSqlDialect.java 
b/core/src/main/java/org/apache/calcite/sql/dialect/HiveSqlDialect.java
index 30fb13e893..db57e5affe 100644
--- a/core/src/main/java/org/apache/calcite/sql/dialect/HiveSqlDialect.java
+++ b/core/src/main/java/org/apache/calcite/sql/dialect/HiveSqlDialect.java
@@ -18,6 +18,7 @@
 
 import org.apache.calcite.config.NullCollation;
 import org.apache.calcite.rel.type.RelDataType;
+import org.apache.calcite.rex.RexNode;
 import org.apache.calcite.sql.SqlAlienSystemTypeNameSpec;
 import org.apache.calcite.sql.SqlBasicCall;
 import org.apache.calcite.sql.SqlCall;
@@ -92,6 +93,10 @@ public HiveSqlDialect(Context context) {
     return null;
   }
 
+  @Override public RexNode prepareUnparse(RexNode rexNode) {
+    return RelToSqlConverterUtil.unparseIsTrueOrFalse(rexNode);
+  }
+
   @Override public void unparseCall(final SqlWriter writer, final SqlCall call,
       final int leftPrec, final int rightPrec) {
     switch (call.getKind()) {
diff --git 
a/core/src/main/java/org/apache/calcite/sql/dialect/PrestoSqlDialect.java 
b/core/src/main/java/org/apache/calcite/sql/dialect/PrestoSqlDialect.java
index a584b81199..2004a6f341 100644
--- a/core/src/main/java/org/apache/calcite/sql/dialect/PrestoSqlDialect.java
+++ b/core/src/main/java/org/apache/calcite/sql/dialect/PrestoSqlDialect.java
@@ -192,6 +192,10 @@ private static void unparseUsingLimit(SqlWriter writer, 
@Nullable SqlNode offset
     }
   }
 
+  @Override public RexNode prepareUnparse(RexNode rexNode) {
+    return RelToSqlConverterUtil.unparseIsTrueOrFalse(rexNode);
+  }
+
   @Override public void unparseCall(SqlWriter writer, SqlCall call,
       int leftPrec, int rightPrec) {
     if (call.getOperator() == SqlStdOperatorTable.SUBSTRING) {
@@ -205,6 +209,17 @@ private static void unparseUsingLimit(SqlWriter writer, 
@Nullable SqlNode offset
       case MAP_VALUE_CONSTRUCTOR:
         unparseMapValue(writer, call, leftPrec, rightPrec);
         break;
+      case IS_NULL:
+      case IS_NOT_NULL:
+        if (call.operand(0) instanceof SqlBasicCall) {
+          final SqlWriter.Frame frame = writer.startList("(", ")");
+          call.operand(0).unparse(writer, leftPrec, rightPrec);
+          writer.endList(frame);
+          writer.print(call.getOperator().getName() + " ");
+        } else {
+          super.unparseCall(writer, call, leftPrec, rightPrec);
+        }
+        break;
       case CHAR_LENGTH:
         SqlCall lengthCall = SqlLibraryOperators.LENGTH
             .createCall(SqlParserPos.ZERO, call.getOperandList());
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 5650b326bd..fbe1f1c264 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
@@ -8748,7 +8748,10 @@ private void checkLiteral2(String expression, String 
expected) {
    * in StarRocksDialect</a>,
    * <a 
href="https://issues.apache.org/jira/browse/CALCITE-6979";>[CALCITE-6979]
    * Invalid unparse for IS TRUE,IS FALSE,IS NOT TRUE and IS NOT FALSE
-   * in ClickHouseDialect</a>.*/
+   * in ClickHouseDialect</a>,
+   * <a 
href="https://issues.apache.org/jira/browse/CALCITE-7005";>[CALCITE-7005]
+   * Invalid unparse for IS TRUE,IS FALSE,IS NOT TRUE and IS NOT FALSE
+   * in Hive/Presto Dialect</a>. */
   @Test void testIsTrue() {
     final String sql = "SELECT * FROM \"EMP\" WHERE \"COMM\" > 0 IS TRUE";
     final String expected = "SELECT *\n"
@@ -8760,9 +8763,16 @@ private void checkLiteral2(String expression, String 
expected) {
     String expectedClickHouse = "SELECT *\n"
         + "FROM `SCOTT`.`EMP`\n"
         + "WHERE CAST(`COMM` AS DECIMAL(12, 2)) > 0.00 IS NOT NULL AND 
CAST(`COMM` AS DECIMAL(12, 2)) > 0.00";
+    String expectedHive = expectedClickHouse;
+    String expectedPresto = "SELECT *\n"
+        + "FROM \"SCOTT\".\"EMP\"\n"
+        + "WHERE (CAST(\"COMM\" AS DECIMAL(12, 2)) > 0.00) IS NOT NULL AND 
CAST(\"COMM\" AS DECIMAL(12, 2)) > 0.00";
+
     sql(sql)
         .schema(CalciteAssert.SchemaSpec.JDBC_SCOTT)
         .ok(expected)
+        .withHive().ok(expectedHive)
+        .withPresto().ok(expectedPresto)
         .withStarRocks().ok(expectedStarRocks)
         .withClickHouse().ok(expectedClickHouse);
 
@@ -8770,6 +8780,10 @@ private void checkLiteral2(String expression, String 
expected) {
         "SELECT * FROM \"EMP\" WHERE \"COMM\" > RAND_INTEGER(10) IS TRUE";
     sql(sqlNoDeterministic)
         .schema(CalciteAssert.SchemaSpec.JDBC_SCOTT)
+        .withHive()
+        .throws_("Unsupported unparse: IS TRUE")
+        .withPresto()
+        .throws_("Unsupported unparse: IS TRUE")
         .withStarRocks()
         .throws_("Unsupported unparse: IS TRUE")
         .withClickHouse()
@@ -8787,9 +8801,16 @@ private void checkLiteral2(String expression, String 
expected) {
     String expectedClickHouse = "SELECT *\n"
         + "FROM `SCOTT`.`EMP`\n"
         + "WHERE CAST(`COMM` AS DECIMAL(12, 2)) > 0.00 IS NULL OR NOT 
CAST(`COMM` AS DECIMAL(12, 2)) > 0.00";
+    String expectedHive = expectedClickHouse;
+    String expectedPresto = "SELECT *\n"
+        + "FROM \"SCOTT\".\"EMP\"\n"
+        + "WHERE (CAST(\"COMM\" AS DECIMAL(12, 2)) > 0.00) IS NULL OR NOT 
CAST(\"COMM\" AS DECIMAL(12, 2)) > 0.00";
+
     sql(sql)
         .schema(CalciteAssert.SchemaSpec.JDBC_SCOTT)
         .ok(expected)
+        .withHive().ok(expectedHive)
+        .withPresto().ok(expectedPresto)
         .withStarRocks().ok(expectedStarRocks)
         .withClickHouse().ok(expectedClickHouse);
 
@@ -8797,6 +8818,10 @@ private void checkLiteral2(String expression, String 
expected) {
         + "FROM \"EMP\" WHERE \"COMM\" > RAND_INTEGER(10) IS NOT TRUE";
     sql(sqlNoDeterministic)
         .schema(CalciteAssert.SchemaSpec.JDBC_SCOTT)
+        .withHive()
+        .throws_("Unsupported unparse: IS NOT TRUE")
+        .withPresto()
+        .throws_("Unsupported unparse: IS NOT TRUE")
         .withStarRocks()
         .throws_("Unsupported unparse: IS NOT TRUE")
         .withClickHouse()
@@ -8814,9 +8839,16 @@ private void checkLiteral2(String expression, String 
expected) {
     String expectedClickHouse = "SELECT *\n"
         + "FROM `SCOTT`.`EMP`\n"
         + "WHERE CAST(`COMM` AS DECIMAL(12, 2)) > 0.00 IS NOT NULL AND NOT 
CAST(`COMM` AS DECIMAL(12, 2)) > 0.00";
+    String expectedHive = expectedClickHouse;
+    String expectedPresto = "SELECT *\n"
+        + "FROM \"SCOTT\".\"EMP\"\n"
+        + "WHERE (CAST(\"COMM\" AS DECIMAL(12, 2)) > 0.00) IS NOT NULL AND NOT 
CAST(\"COMM\" AS DECIMAL(12, 2)) > 0.00";
+
     sql(sql)
         .schema(CalciteAssert.SchemaSpec.JDBC_SCOTT)
         .ok(expected)
+        .withHive().ok(expectedHive)
+        .withPresto().ok(expectedPresto)
         .withStarRocks().ok(expectedStarRocks)
         .withClickHouse().ok(expectedClickHouse);
 
@@ -8824,6 +8856,10 @@ private void checkLiteral2(String expression, String 
expected) {
         + "FROM \"EMP\" WHERE \"COMM\" > RAND_INTEGER(10) IS FALSE";
     sql(sqlNoDeterministic)
         .schema(CalciteAssert.SchemaSpec.JDBC_SCOTT)
+        .withHive()
+        .throws_("Unsupported unparse: IS FALSE")
+        .withPresto()
+        .throws_("Unsupported unparse: IS FALSE")
         .withStarRocks()
         .throws_("Unsupported unparse: IS FALSE")
         .withClickHouse()
@@ -8841,9 +8877,16 @@ private void checkLiteral2(String expression, String 
expected) {
     String expectedClickHouse = "SELECT *\n"
         + "FROM `SCOTT`.`EMP`\n"
         + "WHERE CAST(`COMM` AS DECIMAL(12, 2)) > 0.00 IS NULL OR CAST(`COMM` 
AS DECIMAL(12, 2)) > 0.00";
+    String expectedHive = expectedClickHouse;
+    String expectedPresto = "SELECT *\n"
+        + "FROM \"SCOTT\".\"EMP\"\n"
+        + "WHERE (CAST(\"COMM\" AS DECIMAL(12, 2)) > 0.00) IS NULL OR 
CAST(\"COMM\" AS DECIMAL(12, 2)) > 0.00";
+
     sql(sql)
         .schema(CalciteAssert.SchemaSpec.JDBC_SCOTT)
         .ok(expected)
+        .withHive().ok(expectedHive)
+        .withPresto().ok(expectedPresto)
         .withStarRocks().ok(expectedStarRocks)
         .withClickHouse().ok(expectedClickHouse);
 
@@ -8851,6 +8894,10 @@ private void checkLiteral2(String expression, String 
expected) {
         + "FROM \"EMP\" WHERE \"COMM\" > RAND_INTEGER(10) IS NOT FALSE";
     sql(sqlNoDeterministic)
         .schema(CalciteAssert.SchemaSpec.JDBC_SCOTT)
+        .withHive()
+        .throws_("Unsupported unparse: IS NOT FALSE")
+        .withPresto()
+        .throws_("Unsupported unparse: IS NOT FALSE")
         .withStarRocks()
         .throws_("Unsupported unparse: IS NOT FALSE")
         .withClickHouse()

Reply via email to