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()