The null deduction in RexToLixTranslator is complicated; it’s entirely possible that there are bugs.
I see that you have “NOT IS_NULL(x) AND … AND IS_NOT_NULL(x)”. I think it might help if you optimize NOT IS_NULL —> IS_NOT_NULL as early as possible, i.e. as you create expressions. Then the redundant expression would not be created. Julian > On May 18, 2017, at 11:33 AM, Remus Rusanu <[email protected]> wrote: > > My changes to convert boolean CASE into AND/OR expression are causing a > failure in CalciteSqlOperatorTest.testIsDistinctFromOperator for the > expression > cast(null as integer) is distinct from 2 > > I can see that the CASE logic is being triggered and the conversion occurs: > > CASE($t2, $t4, $t5, $t6, $t7) > is converted into: > OR(AND($t2, $t4), AND(NOT($t2), $t5, $t6), AND(NOT($t2), NOT($t5), $t7)) > > This is the test failure: > > testIsNotDistinctFromOperator(org.apache.calcite.test.CalciteSqlOperatorTest) > Time elapsed: 1.991 sec <<< ERROR! > java.lang.RuntimeException: java.sql.SQLException: Error while executing SQL > "values (cast(null as integer) is not distinct from 2)": null > Caused by: java.sql.SQLException: Error while executing SQL "values > (cast(null as integer) is not distinct from 2)": null > Caused by: org.apache.calcite.adapter.enumerable.RexToLixTranslator$AlwaysNull > > The call being translated is this: > <>($t1, CAST($t9):INTEGER) > > I see that RelOptUtil.isDistinctFromInternal transforms the x IS DISTINCT > FROM y call into > > CASE > WHEN IS_NULL(x) THEN IS_NOT_NULL(y) > WHEN IS_NULL(y) THEN IS_NOT_NULL(x) > ELSE x <> y > END > > My new simplifyCase changes this into: > (IS_NULL(X) AND IS_NOT_NULL(y)) OR (NOT IS_NULL(x) AND IS_NULL(y) AND > IS_NOT_NULL(x)) OR (NOT IS_NULL(X) AND NOT IS_NULL(y) AND x <> y) > > So, if I understand correctly, w/o my change the RexToLix translation would > never have to visit the else branch and deal with the null<>2 case? I did a > brief search, but I did not find anything specific to CASE in > RexToLixTranslator. > > Thanks, > ~Remus > > >
