Skip to content

Commit 412ac80

Browse files
xuzifu666NobiGo
authored andcommitted
[CALCITE-7005] Invalid unparse for IS TRUE,IS FALSE,IS NOT TRUE and IS NOT FALSE in Hive/Presto Dialect
1 parent f6e7618 commit 412ac80

File tree

3 files changed

+68
-1
lines changed

3 files changed

+68
-1
lines changed

core/src/main/java/org/apache/calcite/sql/dialect/HiveSqlDialect.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import org.apache.calcite.config.NullCollation;
2020
import org.apache.calcite.rel.type.RelDataType;
21+
import org.apache.calcite.rex.RexNode;
2122
import org.apache.calcite.sql.SqlAlienSystemTypeNameSpec;
2223
import org.apache.calcite.sql.SqlBasicCall;
2324
import org.apache.calcite.sql.SqlCall;
@@ -92,6 +93,10 @@ public HiveSqlDialect(Context context) {
9293
return null;
9394
}
9495

96+
@Override public RexNode prepareUnparse(RexNode rexNode) {
97+
return RelToSqlConverterUtil.unparseIsTrueOrFalse(rexNode);
98+
}
99+
95100
@Override public void unparseCall(final SqlWriter writer, final SqlCall call,
96101
final int leftPrec, final int rightPrec) {
97102
switch (call.getKind()) {

core/src/main/java/org/apache/calcite/sql/dialect/PrestoSqlDialect.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,10 @@ private static void unparseUsingLimit(SqlWriter writer, @Nullable SqlNode offset
192192
}
193193
}
194194

195+
@Override public RexNode prepareUnparse(RexNode rexNode) {
196+
return RelToSqlConverterUtil.unparseIsTrueOrFalse(rexNode);
197+
}
198+
195199
@Override public void unparseCall(SqlWriter writer, SqlCall call,
196200
int leftPrec, int rightPrec) {
197201
if (call.getOperator() == SqlStdOperatorTable.SUBSTRING) {
@@ -205,6 +209,17 @@ private static void unparseUsingLimit(SqlWriter writer, @Nullable SqlNode offset
205209
case MAP_VALUE_CONSTRUCTOR:
206210
unparseMapValue(writer, call, leftPrec, rightPrec);
207211
break;
212+
case IS_NULL:
213+
case IS_NOT_NULL:
214+
if (call.operand(0) instanceof SqlBasicCall) {
215+
final SqlWriter.Frame frame = writer.startList("(", ")");
216+
call.operand(0).unparse(writer, leftPrec, rightPrec);
217+
writer.endList(frame);
218+
writer.print(call.getOperator().getName() + " ");
219+
} else {
220+
super.unparseCall(writer, call, leftPrec, rightPrec);
221+
}
222+
break;
208223
case CHAR_LENGTH:
209224
SqlCall lengthCall = SqlLibraryOperators.LENGTH
210225
.createCall(SqlParserPos.ZERO, call.getOperandList());

core/src/test/java/org/apache/calcite/rel/rel2sql/RelToSqlConverterTest.java

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8748,7 +8748,10 @@ private void checkLiteral2(String expression, String expected) {
87488748
* in StarRocksDialect</a>,
87498749
* <a href="https://issues.apache.org/jira/browse/CALCITE-6979">[CALCITE-6979]
87508750
* Invalid unparse for IS TRUE,IS FALSE,IS NOT TRUE and IS NOT FALSE
8751-
* in ClickHouseDialect</a>.*/
8751+
* in ClickHouseDialect</a>,
8752+
* <a href="https://issues.apache.org/jira/browse/CALCITE-7005">[CALCITE-7005]
8753+
* Invalid unparse for IS TRUE,IS FALSE,IS NOT TRUE and IS NOT FALSE
8754+
* in Hive/Presto Dialect</a>. */
87528755
@Test void testIsTrue() {
87538756
final String sql = "SELECT * FROM \"EMP\" WHERE \"COMM\" > 0 IS TRUE";
87548757
final String expected = "SELECT *\n"
@@ -8760,16 +8763,27 @@ private void checkLiteral2(String expression, String expected) {
87608763
String expectedClickHouse = "SELECT *\n"
87618764
+ "FROM `SCOTT`.`EMP`\n"
87628765
+ "WHERE CAST(`COMM` AS DECIMAL(12, 2)) > 0.00 IS NOT NULL AND CAST(`COMM` AS DECIMAL(12, 2)) > 0.00";
8766+
String expectedHive = expectedClickHouse;
8767+
String expectedPresto = "SELECT *\n"
8768+
+ "FROM \"SCOTT\".\"EMP\"\n"
8769+
+ "WHERE (CAST(\"COMM\" AS DECIMAL(12, 2)) > 0.00) IS NOT NULL AND CAST(\"COMM\" AS DECIMAL(12, 2)) > 0.00";
8770+
87638771
sql(sql)
87648772
.schema(CalciteAssert.SchemaSpec.JDBC_SCOTT)
87658773
.ok(expected)
8774+
.withHive().ok(expectedHive)
8775+
.withPresto().ok(expectedPresto)
87668776
.withStarRocks().ok(expectedStarRocks)
87678777
.withClickHouse().ok(expectedClickHouse);
87688778

87698779
final String sqlNoDeterministic =
87708780
"SELECT * FROM \"EMP\" WHERE \"COMM\" > RAND_INTEGER(10) IS TRUE";
87718781
sql(sqlNoDeterministic)
87728782
.schema(CalciteAssert.SchemaSpec.JDBC_SCOTT)
8783+
.withHive()
8784+
.throws_("Unsupported unparse: IS TRUE")
8785+
.withPresto()
8786+
.throws_("Unsupported unparse: IS TRUE")
87738787
.withStarRocks()
87748788
.throws_("Unsupported unparse: IS TRUE")
87758789
.withClickHouse()
@@ -8787,16 +8801,27 @@ private void checkLiteral2(String expression, String expected) {
87878801
String expectedClickHouse = "SELECT *\n"
87888802
+ "FROM `SCOTT`.`EMP`\n"
87898803
+ "WHERE CAST(`COMM` AS DECIMAL(12, 2)) > 0.00 IS NULL OR NOT CAST(`COMM` AS DECIMAL(12, 2)) > 0.00";
8804+
String expectedHive = expectedClickHouse;
8805+
String expectedPresto = "SELECT *\n"
8806+
+ "FROM \"SCOTT\".\"EMP\"\n"
8807+
+ "WHERE (CAST(\"COMM\" AS DECIMAL(12, 2)) > 0.00) IS NULL OR NOT CAST(\"COMM\" AS DECIMAL(12, 2)) > 0.00";
8808+
87908809
sql(sql)
87918810
.schema(CalciteAssert.SchemaSpec.JDBC_SCOTT)
87928811
.ok(expected)
8812+
.withHive().ok(expectedHive)
8813+
.withPresto().ok(expectedPresto)
87938814
.withStarRocks().ok(expectedStarRocks)
87948815
.withClickHouse().ok(expectedClickHouse);
87958816

87968817
final String sqlNoDeterministic = "SELECT * \n"
87978818
+ "FROM \"EMP\" WHERE \"COMM\" > RAND_INTEGER(10) IS NOT TRUE";
87988819
sql(sqlNoDeterministic)
87998820
.schema(CalciteAssert.SchemaSpec.JDBC_SCOTT)
8821+
.withHive()
8822+
.throws_("Unsupported unparse: IS NOT TRUE")
8823+
.withPresto()
8824+
.throws_("Unsupported unparse: IS NOT TRUE")
88008825
.withStarRocks()
88018826
.throws_("Unsupported unparse: IS NOT TRUE")
88028827
.withClickHouse()
@@ -8814,16 +8839,27 @@ private void checkLiteral2(String expression, String expected) {
88148839
String expectedClickHouse = "SELECT *\n"
88158840
+ "FROM `SCOTT`.`EMP`\n"
88168841
+ "WHERE CAST(`COMM` AS DECIMAL(12, 2)) > 0.00 IS NOT NULL AND NOT CAST(`COMM` AS DECIMAL(12, 2)) > 0.00";
8842+
String expectedHive = expectedClickHouse;
8843+
String expectedPresto = "SELECT *\n"
8844+
+ "FROM \"SCOTT\".\"EMP\"\n"
8845+
+ "WHERE (CAST(\"COMM\" AS DECIMAL(12, 2)) > 0.00) IS NOT NULL AND NOT CAST(\"COMM\" AS DECIMAL(12, 2)) > 0.00";
8846+
88178847
sql(sql)
88188848
.schema(CalciteAssert.SchemaSpec.JDBC_SCOTT)
88198849
.ok(expected)
8850+
.withHive().ok(expectedHive)
8851+
.withPresto().ok(expectedPresto)
88208852
.withStarRocks().ok(expectedStarRocks)
88218853
.withClickHouse().ok(expectedClickHouse);
88228854

88238855
final String sqlNoDeterministic = "SELECT * \n"
88248856
+ "FROM \"EMP\" WHERE \"COMM\" > RAND_INTEGER(10) IS FALSE";
88258857
sql(sqlNoDeterministic)
88268858
.schema(CalciteAssert.SchemaSpec.JDBC_SCOTT)
8859+
.withHive()
8860+
.throws_("Unsupported unparse: IS FALSE")
8861+
.withPresto()
8862+
.throws_("Unsupported unparse: IS FALSE")
88278863
.withStarRocks()
88288864
.throws_("Unsupported unparse: IS FALSE")
88298865
.withClickHouse()
@@ -8841,16 +8877,27 @@ private void checkLiteral2(String expression, String expected) {
88418877
String expectedClickHouse = "SELECT *\n"
88428878
+ "FROM `SCOTT`.`EMP`\n"
88438879
+ "WHERE CAST(`COMM` AS DECIMAL(12, 2)) > 0.00 IS NULL OR CAST(`COMM` AS DECIMAL(12, 2)) > 0.00";
8880+
String expectedHive = expectedClickHouse;
8881+
String expectedPresto = "SELECT *\n"
8882+
+ "FROM \"SCOTT\".\"EMP\"\n"
8883+
+ "WHERE (CAST(\"COMM\" AS DECIMAL(12, 2)) > 0.00) IS NULL OR CAST(\"COMM\" AS DECIMAL(12, 2)) > 0.00";
8884+
88448885
sql(sql)
88458886
.schema(CalciteAssert.SchemaSpec.JDBC_SCOTT)
88468887
.ok(expected)
8888+
.withHive().ok(expectedHive)
8889+
.withPresto().ok(expectedPresto)
88478890
.withStarRocks().ok(expectedStarRocks)
88488891
.withClickHouse().ok(expectedClickHouse);
88498892

88508893
final String sqlNoDeterministic = "SELECT * \n"
88518894
+ "FROM \"EMP\" WHERE \"COMM\" > RAND_INTEGER(10) IS NOT FALSE";
88528895
sql(sqlNoDeterministic)
88538896
.schema(CalciteAssert.SchemaSpec.JDBC_SCOTT)
8897+
.withHive()
8898+
.throws_("Unsupported unparse: IS NOT FALSE")
8899+
.withPresto()
8900+
.throws_("Unsupported unparse: IS NOT FALSE")
88548901
.withStarRocks()
88558902
.throws_("Unsupported unparse: IS NOT FALSE")
88568903
.withClickHouse()

0 commit comments

Comments
 (0)