Vova Vysotskyi created CALCITE-3457: ---------------------------------------
Summary: RexSimplify incorrectly simplifies IS NOT NULL operator with ITEM call Key: CALCITE-3457 URL: https://issues.apache.org/jira/browse/CALCITE-3457 Project: Calcite Issue Type: Bug Affects Versions: 1.22.0 Reporter: Vova Vysotskyi Fix For: 1.22.0 In CALCITE-3390 ITEM was marked with {{Policy.ANY}} strong policy, but according to its JavaDoc, the result may be null if and only if at least one of its arguments is null. This statement was used in {{RexSimplify.simplifyIsNotNull()}} method, so {{t1.c_nationkey[0] is not null}} will be simplified to {{IS NOT NULL($0)}} which is wrong, since array may be empty, or index may be less than the size of the array. Unit test which helps to reproduce this issue: {noformat} @Test public void testSimplifyItemIsNotNull() { HepProgramBuilder programBuilder = HepProgram.builder() .addRuleInstance(ReduceExpressionsRule.FILTER_INSTANCE); String query = "select * from sales.customer as t1 where t1.c_nationkey[0] is not null"; checkPlanning( createDynamicTester(), null, new HepPlanner(programBuilder.build()), query, false); } {noformat} Returns plan with incorrectly simplified ITEM expression: {noformat} LogicalProject(**=[$1]) LogicalFilter(condition=[IS NOT NULL($0)]) LogicalTableScan(table=[[CATALOG, SALES, CUSTOMER]]) {noformat} But the initial intention of CALCITE-3390 was to allow pushing ITEM expression to the right input of left-outer-join. I propose to add a new element to the {{Policy}} which will have a relaxed condition - expression is null if at least one of its arguments is null. -- This message was sent by Atlassian Jira (v8.3.4#803005)