You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@calcite.apache.org by "Vova Vysotskyi (Jira)" <ji...@apache.org> on 2019/10/29 17:25:00 UTC
[jira] [Created] (CALCITE-3457) RexSimplify incorrectly simplifies
IS NOT NULL operator with ITEM call
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)