DeepSink He created CALCITE-7391:
------------------------------------
Summary: FILTER_REDUCE_EXPRESSIONS crashes on expression where 123
in (SELECT NULL FROM emps)
Key: CALCITE-7391
URL: https://issues.apache.org/jira/browse/CALCITE-7391
Project: Calcite
Issue Type: Bug
Reporter: DeepSink He
The following test added to RelOptRulesTest crashes:
{code:java}
@Test void testPredicatePull2() {
final String sql = "SELECT * from emp where 123 in (select null from dept)";
sql(sql)
.withRule(CoreRules.FILTER_SUB_QUERY_TO_CORRELATE,
CoreRules.FILTER_PROJECT_TRANSPOSE,
CoreRules.PROJECT_REDUCE_EXPRESSIONS)
.check();
} {code}
stack trace:
{code:java}
java.lang.AssertionError: Comparison with NULL in pulledUpPredicates at
org.apache.calcite.util.Litmus.lambda$static$0(Litmus.java:31)
at org.apache.calcite.util.Litmus.check(Litmus.java:76)
at
org.apache.calcite.plan.RelOptPredicateList.<init>(RelOptPredicateList.java:134)
at
org.apache.calcite.plan.RelOptPredicateList.of(RelOptPredicateList.java:206)
at
org.apache.calcite.plan.RelOptPredicateList.of(RelOptPredicateList.java:159)
....
at
org.apache.calcite.rel.metadata.RelMetadataQuery.getPulledUpPredicates(RelMetadataQuery.java:914)
at
org.apache.calcite.rel.metadata.RelMdPredicates.getPredicates(RelMdPredicates.java:390)
at
org.apache.calcite.rel.metadata.janino.GeneratedMetadata_PredicatesHandler.getPredicates_$(Unknown
Source)
at
org.apache.calcite.rel.metadata.janino.GeneratedMetadata_PredicatesHandler.getPredicates(Unknown
Source)
at
org.apache.calcite.rel.metadata.RelMetadataQuery.getPulledUpPredicates(RelMetadataQuery.java:914)
at
org.apache.calcite.rel.metadata.RelMdPredicates.getPredicates(RelMdPredicates.java:342)
at
org.apache.calcite.rel.metadata.janino.GeneratedMetadata_PredicatesHandler.getPredicates_$(Unknown
Source)
at
org.apache.calcite.rel.metadata.janino.GeneratedMetadata_PredicatesHandler.getPredicates(Unknown
Source)
at
org.apache.calcite.rel.metadata.RelMetadataQuery.getPulledUpPredicates(RelMetadataQuery.java:914)
at
org.apache.calcite.rel.metadata.RelMdPredicates.getPredicates(RelMdPredicates.java:194)
at
org.apache.calcite.rel.metadata.janino.GeneratedMetadata_PredicatesHandler.getPredicates_$(Unknown
Source)
at
org.apache.calcite.rel.metadata.janino.GeneratedMetadata_PredicatesHandler.getPredicates(Unknown
Source)
at
org.apache.calcite.rel.metadata.RelMetadataQuery.getPulledUpPredicates(RelMetadataQuery.java:914)
at
org.apache.calcite.rel.rules.ReduceExpressionsRule$ProjectReduceExpressionsRule.onMatch(ReduceExpressionsRule.java:312)
{code}
After applied "CoreRules.FILTER_SUB_QUERY_TO_CORRELATE" and
"CoreRules.FILTER_PROJECT_TRANSPOSE" rules, the logical plan transformed to :
{code:java}
> LogicalProject(EMPNO=[$0], ENAME=[$1], JOB=[$2], MGR=[$3], HIREDATE=[$4],
> SAL=[$5], COMM=[$6], DEPTNO=[$7], SLACKER=[$8])
> LogicalProject(EMPNO=[$0], ENAME=[$1], JOB=[$2], MGR=[$3], HIREDATE=[$4],
> SAL=[$5], COMM=[$6], DEPTNO=[$7], SLACKER=[$8])
> LogicalJoin(condition=[true], joinType=[inner])
> LogicalTableScan(table=[[CATALOG, SALES, EMP]])
> LogicalAggregate(group=[{0}])
> LogicalProject(cs=[true])
> LogicalProject(EXPR$0=[null:INTEGER])
> LogicalFilter(condition=[=(123, null)])
> LogicalTableScan(table=[[CATALOG, SALES, DEPT]]) {code}
And then apply "CoreRules.FILTER_PROJECT_TRANSPOSE" rule
{code:java}
final RelOptPredicateList predicates =
mq.getPulledUpPredicates(project.getInput()); {code}
cause the AssertionError.
I think we shoud simplify the "newCondition" after apply the
“FilterProjectTransposeRule” to transform "condition=[=(123, null)]" to
"condition=[=false]"
related issue: https://issues.apache.org/jira/browse/CALCITE-7070
--
This message was sent by Atlassian Jira
(v8.20.10#820010)