[ 
https://issues.apache.org/jira/browse/CALCITE-7070?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=18030395#comment-18030395
 ] 

Mihai Budiu commented on CALCITE-7070:
--------------------------------------

Unfortunately I have to reopen this a second time; I will post here an example 
which triggers the bug.

My attempt to simplify the code has simplified the code too much.

The problem is the following: some data structures assume that there are no 
predicates that compare against null. The previous version of this code would 
check and remove such comparisons (which all evaluate to 'false'). In my last 
fix I only removed such comparisons from the input program. However, 
simplification steps can still produce such comparisons, so in the end an 
assertion fails:
{code:java}
Caused by: 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:128)
        at 
org.apache.calcite.plan.RelOptPredicateList.of(RelOptPredicateList.java:206)
        at 
org.apache.calcite.rel.metadata.RelMdPredicates$JoinConditionBasedPredicateInference.inferPredicates(RelMdPredicates.java:839)
{code}

> FILTER_REDUCE_EXPRESSIONS crashes on expression BETWEEN ( NULL) AND X
> ---------------------------------------------------------------------
>
>                 Key: CALCITE-7070
>                 URL: https://issues.apache.org/jira/browse/CALCITE-7070
>             Project: Calcite
>          Issue Type: Bug
>          Components: core
>    Affects Versions: 1.40.0
>            Reporter: Mihai Budiu
>            Assignee: Mihai Budiu
>            Priority: Minor
>              Labels: pull-request-available
>             Fix For: 1.41.0
>
>
> The following test inserted in RelOptRulesTest crashes:
> {code}
>     final String sql = "SELECT + 54 FROM emp WHERE NOT CAST ( CAST(empno AS 
> DOUBLE) AS INTEGER ) NOT BETWEEN ( NULL ) AND 89";
>     sql(sql)
>         .withRule(CoreRules.FILTER_REDUCE_EXPRESSIONS)
>         .check();
> {code}
> stack trace:
> {code}
> java.lang.AssertionError: value must not be null in null:INTEGER
> at org.apache.calcite.rex.RexSimplify.residue(RexSimplify.java:1968)
>       at 
> org.apache.calcite.rex.RexSimplify.simplifyUsingPredicates(RexSimplify.java:1909)
>       at 
> org.apache.calcite.rex.RexSimplify.simplifyComparison(RexSimplify.java:655)
>       at 
> org.apache.calcite.rex.RexSimplify.simplifyComparison(RexSimplify.java:517)
>       at org.apache.calcite.rex.RexSimplify.simplify(RexSimplify.java:313)
>       at 
> org.apache.calcite.rex.RexSimplify.simplifyAndTerms(RexSimplify.java:694)
>       at org.apache.calcite.rex.RexSimplify.simplifyAnd(RexSimplify.java:1559)
>       at org.apache.calcite.rex.RexSimplify.simplify(RexSimplify.java:282)
>       at org.apache.calcite.rex.RexSimplify.simplifyNot(RexSimplify.java:761)
>       at org.apache.calcite.rex.RexSimplify.simplify(RexSimplify.java:286)
>       at 
> org.apache.calcite.rex.RexSimplify.simplifyUnknownAs(RexSimplify.java:251)
>       at 
> org.apache.calcite.rex.RexSimplify.simplifyPreservingType(RexSimplify.java:190)
>       at 
> org.apache.calcite.rel.rules.ReduceExpressionsRule.reduceExpressions(ReduceExpressionsRule.java:722)
>       at 
> org.apache.calcite.rel.rules.ReduceExpressionsRule$FilterReduceExpressionsRule.onMatch(ReduceExpressionsRule.java:159)
> {code}
> This test is modified from SqlLogicTest.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to