You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@calcite.apache.org by "Jiatao Tao (Jira)" <ji...@apache.org> on 2020/11/06 09:12:00 UTC

[jira] [Comment Edited] (CALCITE-4381) CoreQuidemTest#[8] throws ArrayIndexOutOfBoundsException when enable ProjectJoinTransposeRule

    [ https://issues.apache.org/jira/browse/CALCITE-4381?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17227256#comment-17227256 ] 

Jiatao Tao edited comment on CALCITE-4381 at 11/6/20, 9:11 AM:
---------------------------------------------------------------

sql:

select * from dept
 where deptno in (select deptno from emp where gender = 'F')
 or deptno in (select deptno from emp where gender = 'M')"

 

Plan before volcano planner:

And there's empty aggregate: " LogicalAggregate(group=[{}])" caused this array out of boundary.
{code:java}
LogicalProject(DEPTNO=[$0], DNAME=[$1])
  LogicalFilter(condition=[OR(AND(<>($2, 0), IS NOT NULL($4)), AND(<>($2, 0), IS NOT NULL($6)))])
    LogicalJoin(condition=[=($0, $5)], joinType=[left])
      LogicalJoin(condition=[true], joinType=[inner])
        LogicalJoin(condition=[=($0, $3)], joinType=[left])
          LogicalJoin(condition=[true], joinType=[inner])
            LogicalProject(DEPTNO=[$0], DNAME=[$1])
              LogicalValues(tuples=[[{ 10, 'Sales      ' }, { 20, 'Marketing  ' }, { 30, 'Engineering' }, { 40, 'Empty      ' }]])
            LogicalAggregate(group=[{}], c=[COUNT()])
              LogicalFilter(condition=[=($1, 'F')])
                LogicalUnion(all=[true])
                  LogicalProject(EXPR$1=[10], EXPR$2=['F'])
                    LogicalValues(tuples=[[{ 0 }]])
                  LogicalProject(EXPR$1=[10], EXPR$2=['M'])
                    LogicalValues(tuples=[[{ 0 }]])
                  LogicalProject(EXPR$1=[20], EXPR$2=['M'])
                    LogicalValues(tuples=[[{ 0 }]])
                  LogicalProject(EXPR$1=[30], EXPR$2=['F'])
                    LogicalValues(tuples=[[{ 0 }]])
                  LogicalProject(EXPR$1=[30], EXPR$2=['F'])
                    LogicalValues(tuples=[[{ 0 }]])
                  LogicalProject(EXPR$1=[50], EXPR$2=['M'])
                    LogicalValues(tuples=[[{ 0 }]])
                  LogicalProject(EXPR$1=[50], EXPR$2=['F'])
                    LogicalValues(tuples=[[{ 0 }]])
                  LogicalProject(EXPR$1=[60], EXPR$2=['F'])
                    LogicalValues(tuples=[[{ 0 }]])
                  LogicalProject(EXPR$1=[null:INTEGER], EXPR$2=['F'])
                    LogicalValues(tuples=[[{ 0 }]])
          LogicalAggregate(group=[{0, 1}])
            LogicalProject(DEPTNO=[$0], i=[true])
              LogicalFilter(condition=[=($1, 'F')])
                LogicalUnion(all=[true])
                  LogicalProject(EXPR$1=[10], EXPR$2=['F'])
                    LogicalValues(tuples=[[{ 0 }]])
                  LogicalProject(EXPR$1=[10], EXPR$2=['M'])
                    LogicalValues(tuples=[[{ 0 }]])
                  LogicalProject(EXPR$1=[20], EXPR$2=['M'])
                    LogicalValues(tuples=[[{ 0 }]])
                  LogicalProject(EXPR$1=[30], EXPR$2=['F'])
                    LogicalValues(tuples=[[{ 0 }]])
                  LogicalProject(EXPR$1=[30], EXPR$2=['F'])
                    LogicalValues(tuples=[[{ 0 }]])
                  LogicalProject(EXPR$1=[50], EXPR$2=['M'])
                    LogicalValues(tuples=[[{ 0 }]])
                  LogicalProject(EXPR$1=[50], EXPR$2=['F'])
                    LogicalValues(tuples=[[{ 0 }]])
                  LogicalProject(EXPR$1=[60], EXPR$2=['F'])
                    LogicalValues(tuples=[[{ 0 }]])
                  LogicalProject(EXPR$1=[null:INTEGER], EXPR$2=['F'])
                    LogicalValues(tuples=[[{ 0 }]])
        LogicalAggregate(group=[{}])
          LogicalFilter(condition=[=($1, 'M')])
            LogicalUnion(all=[true])
              LogicalProject(EXPR$1=[10], EXPR$2=['F'])
                LogicalValues(tuples=[[{ 0 }]])
              LogicalProject(EXPR$1=[10], EXPR$2=['M'])
                LogicalValues(tuples=[[{ 0 }]])
              LogicalProject(EXPR$1=[20], EXPR$2=['M'])
                LogicalValues(tuples=[[{ 0 }]])
              LogicalProject(EXPR$1=[30], EXPR$2=['F'])
                LogicalValues(tuples=[[{ 0 }]])
              LogicalProject(EXPR$1=[30], EXPR$2=['F'])
                LogicalValues(tuples=[[{ 0 }]])
              LogicalProject(EXPR$1=[50], EXPR$2=['M'])
                LogicalValues(tuples=[[{ 0 }]])
              LogicalProject(EXPR$1=[50], EXPR$2=['F'])
                LogicalValues(tuples=[[{ 0 }]])
              LogicalProject(EXPR$1=[60], EXPR$2=['F'])
                LogicalValues(tuples=[[{ 0 }]])
              LogicalProject(EXPR$1=[null:INTEGER], EXPR$2=['F'])
                LogicalValues(tuples=[[{ 0 }]])
      LogicalAggregate(group=[{0, 1}])
        LogicalProject(DEPTNO=[$0], i=[true])
          LogicalFilter(condition=[=($1, 'M')])
            LogicalUnion(all=[true])
              LogicalProject(EXPR$1=[10], EXPR$2=['F'])
                LogicalValues(tuples=[[{ 0 }]])
              LogicalProject(EXPR$1=[10], EXPR$2=['M'])
                LogicalValues(tuples=[[{ 0 }]])
              LogicalProject(EXPR$1=[20], EXPR$2=['M'])
                LogicalValues(tuples=[[{ 0 }]])
              LogicalProject(EXPR$1=[30], EXPR$2=['F'])
                LogicalValues(tuples=[[{ 0 }]])
              LogicalProject(EXPR$1=[30], EXPR$2=['F'])
                LogicalValues(tuples=[[{ 0 }]])
              LogicalProject(EXPR$1=[50], EXPR$2=['M'])
                LogicalValues(tuples=[[{ 0 }]])
              LogicalProject(EXPR$1=[50], EXPR$2=['F'])
                LogicalValues(tuples=[[{ 0 }]])
              LogicalProject(EXPR$1=[60], EXPR$2=['F'])
                LogicalValues(tuples=[[{ 0 }]])
              LogicalProject(EXPR$1=[null:INTEGER], EXPR$2=['F'])
                LogicalValues(tuples=[[{ 0 }]])

{code}


was (Author: aron.tao):
sql:

select * from dept
where deptno in (select deptno from emp where gender = 'F')
or deptno in (select deptno from emp where gender = 'M')"

 

Plan before volcano planner:
{code:java}
LogicalProject(DEPTNO=[$0], DNAME=[$1])
  LogicalFilter(condition=[OR(AND(<>($2, 0), IS NOT NULL($4)), AND(<>($2, 0), IS NOT NULL($6)))])
    LogicalJoin(condition=[=($0, $5)], joinType=[left])
      LogicalJoin(condition=[true], joinType=[inner])
        LogicalJoin(condition=[=($0, $3)], joinType=[left])
          LogicalJoin(condition=[true], joinType=[inner])
            LogicalProject(DEPTNO=[$0], DNAME=[$1])
              LogicalValues(tuples=[[{ 10, 'Sales      ' }, { 20, 'Marketing  ' }, { 30, 'Engineering' }, { 40, 'Empty      ' }]])
            LogicalAggregate(group=[{}], c=[COUNT()])
              LogicalFilter(condition=[=($1, 'F')])
                LogicalUnion(all=[true])
                  LogicalProject(EXPR$1=[10], EXPR$2=['F'])
                    LogicalValues(tuples=[[{ 0 }]])
                  LogicalProject(EXPR$1=[10], EXPR$2=['M'])
                    LogicalValues(tuples=[[{ 0 }]])
                  LogicalProject(EXPR$1=[20], EXPR$2=['M'])
                    LogicalValues(tuples=[[{ 0 }]])
                  LogicalProject(EXPR$1=[30], EXPR$2=['F'])
                    LogicalValues(tuples=[[{ 0 }]])
                  LogicalProject(EXPR$1=[30], EXPR$2=['F'])
                    LogicalValues(tuples=[[{ 0 }]])
                  LogicalProject(EXPR$1=[50], EXPR$2=['M'])
                    LogicalValues(tuples=[[{ 0 }]])
                  LogicalProject(EXPR$1=[50], EXPR$2=['F'])
                    LogicalValues(tuples=[[{ 0 }]])
                  LogicalProject(EXPR$1=[60], EXPR$2=['F'])
                    LogicalValues(tuples=[[{ 0 }]])
                  LogicalProject(EXPR$1=[null:INTEGER], EXPR$2=['F'])
                    LogicalValues(tuples=[[{ 0 }]])
          LogicalAggregate(group=[{0, 1}])
            LogicalProject(DEPTNO=[$0], i=[true])
              LogicalFilter(condition=[=($1, 'F')])
                LogicalUnion(all=[true])
                  LogicalProject(EXPR$1=[10], EXPR$2=['F'])
                    LogicalValues(tuples=[[{ 0 }]])
                  LogicalProject(EXPR$1=[10], EXPR$2=['M'])
                    LogicalValues(tuples=[[{ 0 }]])
                  LogicalProject(EXPR$1=[20], EXPR$2=['M'])
                    LogicalValues(tuples=[[{ 0 }]])
                  LogicalProject(EXPR$1=[30], EXPR$2=['F'])
                    LogicalValues(tuples=[[{ 0 }]])
                  LogicalProject(EXPR$1=[30], EXPR$2=['F'])
                    LogicalValues(tuples=[[{ 0 }]])
                  LogicalProject(EXPR$1=[50], EXPR$2=['M'])
                    LogicalValues(tuples=[[{ 0 }]])
                  LogicalProject(EXPR$1=[50], EXPR$2=['F'])
                    LogicalValues(tuples=[[{ 0 }]])
                  LogicalProject(EXPR$1=[60], EXPR$2=['F'])
                    LogicalValues(tuples=[[{ 0 }]])
                  LogicalProject(EXPR$1=[null:INTEGER], EXPR$2=['F'])
                    LogicalValues(tuples=[[{ 0 }]])
        LogicalAggregate(group=[{}])
          LogicalFilter(condition=[=($1, 'M')])
            LogicalUnion(all=[true])
              LogicalProject(EXPR$1=[10], EXPR$2=['F'])
                LogicalValues(tuples=[[{ 0 }]])
              LogicalProject(EXPR$1=[10], EXPR$2=['M'])
                LogicalValues(tuples=[[{ 0 }]])
              LogicalProject(EXPR$1=[20], EXPR$2=['M'])
                LogicalValues(tuples=[[{ 0 }]])
              LogicalProject(EXPR$1=[30], EXPR$2=['F'])
                LogicalValues(tuples=[[{ 0 }]])
              LogicalProject(EXPR$1=[30], EXPR$2=['F'])
                LogicalValues(tuples=[[{ 0 }]])
              LogicalProject(EXPR$1=[50], EXPR$2=['M'])
                LogicalValues(tuples=[[{ 0 }]])
              LogicalProject(EXPR$1=[50], EXPR$2=['F'])
                LogicalValues(tuples=[[{ 0 }]])
              LogicalProject(EXPR$1=[60], EXPR$2=['F'])
                LogicalValues(tuples=[[{ 0 }]])
              LogicalProject(EXPR$1=[null:INTEGER], EXPR$2=['F'])
                LogicalValues(tuples=[[{ 0 }]])
      LogicalAggregate(group=[{0, 1}])
        LogicalProject(DEPTNO=[$0], i=[true])
          LogicalFilter(condition=[=($1, 'M')])
            LogicalUnion(all=[true])
              LogicalProject(EXPR$1=[10], EXPR$2=['F'])
                LogicalValues(tuples=[[{ 0 }]])
              LogicalProject(EXPR$1=[10], EXPR$2=['M'])
                LogicalValues(tuples=[[{ 0 }]])
              LogicalProject(EXPR$1=[20], EXPR$2=['M'])
                LogicalValues(tuples=[[{ 0 }]])
              LogicalProject(EXPR$1=[30], EXPR$2=['F'])
                LogicalValues(tuples=[[{ 0 }]])
              LogicalProject(EXPR$1=[30], EXPR$2=['F'])
                LogicalValues(tuples=[[{ 0 }]])
              LogicalProject(EXPR$1=[50], EXPR$2=['M'])
                LogicalValues(tuples=[[{ 0 }]])
              LogicalProject(EXPR$1=[50], EXPR$2=['F'])
                LogicalValues(tuples=[[{ 0 }]])
              LogicalProject(EXPR$1=[60], EXPR$2=['F'])
                LogicalValues(tuples=[[{ 0 }]])
              LogicalProject(EXPR$1=[null:INTEGER], EXPR$2=['F'])
                LogicalValues(tuples=[[{ 0 }]])

{code}

> CoreQuidemTest#[8] throws ArrayIndexOutOfBoundsException when enable ProjectJoinTransposeRule
> ---------------------------------------------------------------------------------------------
>
>                 Key: CALCITE-4381
>                 URL: https://issues.apache.org/jira/browse/CALCITE-4381
>             Project: Calcite
>          Issue Type: Bug
>          Components: core
>            Reporter: Jiatao Tao
>            Assignee: Jiatao Tao
>            Priority: Major
>
> Code in [https://github.com/Aaaaaaron/calcite/tree/CALCITE-4378]
> Just add CoreRules.PROJECT_JOIN_TRANSPOSE to RelOptRules#BASE_RULES, then run CoreQuidemTest can reproduce his.



--
This message was sent by Atlassian Jira
(v8.3.4#803005)