ILuffZhe commented on code in PR #3296:
URL: https://github.com/apache/calcite/pull/3296#discussion_r1254333049
##########
core/src/test/java/org/apache/calcite/rex/RexProgramTest.java:
##########
@@ -2458,6 +2458,79 @@ private SqlOperator getNoDeterministicOperator() {
checkSimplifyUnchanged(isNull(cast(vVarcharNotNull(), tInt(false))));
}
+ /** Unit test for
+ * <a
href="https://issues.apache.org/jira/browse/CALCITE-5769">[CALCITE-5769]
+ * Optimizing 'CAST(e AS t) IS NOT NULL' to 'e IS NOT NULL'</a>. */
+ @Test void testSimplifyCastIsNull3() {
+ // "(cast A as bigint) IS NULL" when A is int and A is not null
+ // ==>
+ // "false"
+ checkSimplify(isNull(cast(vIntNotNull(), tBigInt(false))), "false");
+ // "(cast A as smallint) IS NULL" when A is int and A is not null
+ // ==>
+ // "(cast A as smallint) IS NULL"
+ checkSimplifyUnchanged(isNull(cast(vIntNotNull(), tSmallInt(false))));
+ // "(cast A as varbinary) IS NULL" when A is varchar and A is not null
+ // ==>
+ // "(cast A as varbinary) IS NULL"
+ checkSimplifyUnchanged(isNotNull(cast(vVarcharNotNull(),
tVarbinary(false))));
+ }
+
+ /** Unit test for
+ * <a
href="https://issues.apache.org/jira/browse/CALCITE-5769">[CALCITE-5769]
+ * Optimizing 'CAST(e AS t) IS NOT NULL' to 'e IS NOT NULL'</a>. */
+ @Test void testSimplifyCastIsNull4() {
+ // "(cast A as bigint) IS NULL" when A is int and A is nullable
+ // ==>
+ // "A IS NULL"
Review Comment:
Why we get `A IS NULL` instead of `true` here?
##########
core/src/test/resources/sql/misc.iq:
##########
@@ -2400,4 +2400,124 @@ TS
1969-07-21 00:00:00
!ok
+!use scott
+!set outputformat mysql
+
+# [CALCITE-5769] Optimizing 'CAST(e AS t) IS NOT NULL' to 'e IS NOT NULL'
+
+# Test CAST(e as t) IS NOT NULL when CAST is lossless And e IS NOT NULL
+select cast(deptno as integer) IS NOT NULL from "scott".dept;
++--------+
+| EXPR$0 |
++--------+
+| true |
+| true |
+| true |
+| true |
++--------+
+(4 rows)
+
+!ok
+EnumerableCalc(expr#0..2=[{inputs}], expr#3=[true], EXPR$0=[$t3])
+ EnumerableTableScan(table=[[scott, DEPT]])
+!plan
+
+# Test CAST(e as t) IS NULL when CAST is lossless And e IS NOT NULL
+select cast(deptno as integer) IS NULL from "scott".dept;
++--------+
+| EXPR$0 |
++--------+
+| false |
+| false |
+| false |
+| false |
++--------+
+(4 rows)
+
+!ok
+EnumerableCalc(expr#0..2=[{inputs}], expr#3=[false], EXPR$0=[$t3])
+ EnumerableTableScan(table=[[scott, DEPT]])
+!plan
+
+# Test CAST(e as t) IS NOT NULL when CAST is lossless And e is nullable
+select cast(mgr as integer) IS NOT NULL from "scott".emp;
++--------+
+| EXPR$0 |
++--------+
+| false |
+| true |
+| true |
+| true |
+| true |
+| true |
+| true |
+| true |
+| true |
+| true |
+| true |
+| true |
+| true |
+| true |
++--------+
+(14 rows)
+
+!ok
+EnumerableCalc(expr#0..7=[{inputs}], expr#8=[IS NOT NULL($t3)], EXPR$0=[$t8])
+ EnumerableTableScan(table=[[scott, EMP]])
+!plan
+
+# Test CAST(e as t) IS NULL when CAST is lossless And e is nullable
+select cast(mgr as integer) IS NULL from "scott".emp;
++--------+
+| EXPR$0 |
++--------+
+| false |
+| true |
+| false |
+| false |
+| false |
+| false |
+| false |
+| false |
+| false |
+| false |
+| false |
+| false |
+| false |
+| false |
++--------+
+(14 rows)
+
+!ok
+EnumerableCalc(expr#0..7=[{inputs}], expr#8=[IS NULL($t3)], EXPR$0=[$t8])
+ EnumerableTableScan(table=[[scott, EMP]])
+!plan
+
+# Test CAST(e as t) IS NULL when CAST is not lossless And e is nullable
Review Comment:
We won't simplify the CAST that is not lossless, may I ask what's this test
for?
##########
core/src/test/resources/sql/misc.iq:
##########
@@ -2400,4 +2400,124 @@ TS
1969-07-21 00:00:00
!ok
+!use scott
+!set outputformat mysql
+
+# [CALCITE-5769] Optimizing 'CAST(e AS t) IS NOT NULL' to 'e IS NOT NULL'
+
+# Test CAST(e as t) IS NOT NULL when CAST is lossless And e IS NOT NULL
+select cast(deptno as integer) IS NOT NULL from "scott".dept;
++--------+
+| EXPR$0 |
++--------+
+| true |
+| true |
+| true |
+| true |
++--------+
+(4 rows)
+
+!ok
+EnumerableCalc(expr#0..2=[{inputs}], expr#3=[true], EXPR$0=[$t3])
+ EnumerableTableScan(table=[[scott, DEPT]])
+!plan
+
+# Test CAST(e as t) IS NULL when CAST is lossless And e IS NOT NULL
+select cast(deptno as integer) IS NULL from "scott".dept;
++--------+
+| EXPR$0 |
++--------+
+| false |
+| false |
+| false |
+| false |
++--------+
+(4 rows)
+
+!ok
+EnumerableCalc(expr#0..2=[{inputs}], expr#3=[false], EXPR$0=[$t3])
+ EnumerableTableScan(table=[[scott, DEPT]])
+!plan
+
+# Test CAST(e as t) IS NOT NULL when CAST is lossless And e is nullable
+select cast(mgr as integer) IS NOT NULL from "scott".emp;
++--------+
+| EXPR$0 |
++--------+
+| false |
+| true |
+| true |
+| true |
+| true |
+| true |
+| true |
+| true |
+| true |
+| true |
+| true |
+| true |
+| true |
+| true |
++--------+
+(14 rows)
+
+!ok
+EnumerableCalc(expr#0..7=[{inputs}], expr#8=[IS NOT NULL($t3)], EXPR$0=[$t8])
+ EnumerableTableScan(table=[[scott, EMP]])
+!plan
+
+# Test CAST(e as t) IS NULL when CAST is lossless And e is nullable
+select cast(mgr as integer) IS NULL from "scott".emp;
++--------+
+| EXPR$0 |
++--------+
+| false |
+| true |
+| false |
+| false |
+| false |
+| false |
+| false |
+| false |
+| false |
+| false |
+| false |
+| false |
+| false |
+| false |
++--------+
+(14 rows)
+
+!ok
+EnumerableCalc(expr#0..7=[{inputs}], expr#8=[IS NULL($t3)], EXPR$0=[$t8])
+ EnumerableTableScan(table=[[scott, EMP]])
+!plan
+
+# Test CAST(e as t) IS NULL when CAST is not lossless And e is nullable
+select cast(comm as integer) IS NOT NULL from "scott".emp;
Review Comment:
The test case doesn't fit the description, you want to test `IS NULL` or `IS
NOT NULL`?
##########
core/src/test/java/org/apache/calcite/rex/RexProgramTest.java:
##########
@@ -2458,6 +2458,79 @@ private SqlOperator getNoDeterministicOperator() {
checkSimplifyUnchanged(isNull(cast(vVarcharNotNull(), tInt(false))));
}
+ /** Unit test for
+ * <a
href="https://issues.apache.org/jira/browse/CALCITE-5769">[CALCITE-5769]
+ * Optimizing 'CAST(e AS t) IS NOT NULL' to 'e IS NOT NULL'</a>. */
+ @Test void testSimplifyCastIsNull3() {
+ // "(cast A as bigint) IS NULL" when A is int and A is not null
+ // ==>
+ // "false"
+ checkSimplify(isNull(cast(vIntNotNull(), tBigInt(false))), "false");
+ // "(cast A as smallint) IS NULL" when A is int and A is not null
+ // ==>
+ // "(cast A as smallint) IS NULL"
+ checkSimplifyUnchanged(isNull(cast(vIntNotNull(), tSmallInt(false))));
+ // "(cast A as varbinary) IS NULL" when A is varchar and A is not null
+ // ==>
+ // "(cast A as varbinary) IS NULL"
+ checkSimplifyUnchanged(isNotNull(cast(vVarcharNotNull(),
tVarbinary(false))));
+ }
+
+ /** Unit test for
+ * <a
href="https://issues.apache.org/jira/browse/CALCITE-5769">[CALCITE-5769]
+ * Optimizing 'CAST(e AS t) IS NOT NULL' to 'e IS NOT NULL'</a>. */
+ @Test void testSimplifyCastIsNull4() {
+ // "(cast A as bigint) IS NULL" when A is int and A is nullable
+ // ==>
+ // "A IS NULL"
Review Comment:
Why we get `A IS NULL` instead of `true` here?
##########
core/src/test/java/org/apache/calcite/rex/RexProgramTest.java:
##########
@@ -2458,6 +2458,79 @@ private SqlOperator getNoDeterministicOperator() {
checkSimplifyUnchanged(isNull(cast(vVarcharNotNull(), tInt(false))));
}
+ /** Unit test for
Review Comment:
I noticed that there are many duplicated java doc for those tests, it would
be much better if we propose a suitable way to organize them. But I'm OK with
it if remains still.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]