[ 
https://issues.apache.org/jira/browse/CALCITE-3457?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Vova Vysotskyi updated CALCITE-3457:
------------------------------------
    Description: 
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() {
    String query = "select * from sales.customer as t1 where t1.c_nationkey[0] 
is not null";

    sql(query)
        .withTester(t -> createDynamicTester())
        .withRule(ReduceExpressionsRule.FILTER_INSTANCE)
        .check();
  }
{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.

  was:
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.


> 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() {
>     String query = "select * from sales.customer as t1 where 
> t1.c_nationkey[0] is not null";
>     sql(query)
>         .withTester(t -> createDynamicTester())
>         .withRule(ReduceExpressionsRule.FILTER_INSTANCE)
>         .check();
>   }
> {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)

Reply via email to