[
https://issues.apache.org/jira/browse/CALCITE-3457?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16962279#comment-16962279
]
Julian Hyde commented on CALCITE-3457:
--------------------------------------
Maybe we have the nullability of the array-item operator all wrong. Consider
{{x[y]}}. Even if {{x}} is not null, and all the elements of {{x}} are not
null, and {{y}} is not null, {{x[y]}} may still be null, if {{y}} is beyond the
end of the array. So, deriving the type of the expression as nullable may be
the solution.
> 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
> Priority: Major
> 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)