You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@calcite.apache.org by "Ian Bertolacci (Jira)" <ji...@apache.org> on 2022/07/12 01:24:00 UTC

[jira] [Created] (CALCITE-5209) ArrayIndexOutOfBoundsException during SqlToRelConverter for group-by with `in` expression predicates exceeding SqlRelConverter.Config InSubQueryThreshold

Ian Bertolacci created CALCITE-5209:
---------------------------------------

             Summary: ArrayIndexOutOfBoundsException during SqlToRelConverter for group-by with `in` expression predicates exceeding SqlRelConverter.Config InSubQueryThreshold
                 Key: CALCITE-5209
                 URL: https://issues.apache.org/jira/browse/CALCITE-5209
             Project: Calcite
          Issue Type: Bug
            Reporter: Ian Bertolacci


For these examples assume that:
- {{`SqlToRelConverter.Config.config().withInSubQueryThreshold(5)`}} has been set.
- The source table has 4 columns (Column_0 through Column_3)
- Each column is of type BIGINT NOT NULL

The failing query is:
{code}
select
    case
        when Column_3 in (1, 2, 3, 4, 5) THEN 1
        else 0
    end
from T1000
group by
    case
        when Column_3 in (1, 2, 3, 4, 5) THEN 1
        else 0
    end
{code}

The exception is:
{code}
3
java.lang.ArrayIndexOutOfBoundsException: 3
	at com.google.common.collect.RegularImmutableList.get(RegularImmutableList.java:75)
	at org.apache.calcite.tools.RelBuilder.inferAlias(RelBuilder.java:2163)
	at org.apache.calcite.tools.RelBuilder.project_(RelBuilder.java:1956)
	at org.apache.calcite.tools.RelBuilder.project(RelBuilder.java:1797)
	at org.apache.calcite.tools.RelBuilder.project(RelBuilder.java:1769)
	at org.apache.calcite.tools.RelBuilder.project(RelBuilder.java:1758)
	at org.apache.calcite.sql2rel.SqlToRelConverter$Blackboard.register(SqlToRelConverter.java:4680)
	at org.apache.calcite.sql2rel.SqlToRelConverter.substituteSubQuery(SqlToRelConverter.java:1268)
	at org.apache.calcite.sql2rel.SqlToRelConverter.replaceSubQueries(SqlToRelConverter.java:1127)
	at org.apache.calcite.sql2rel.SqlToRelConverter.createAggImpl(SqlToRelConverter.java:3325)
	at org.apache.calcite.sql2rel.SqlToRelConverter.convertAgg(SqlToRelConverter.java:3192)
	at org.apache.calcite.sql2rel.SqlToRelConverter.convertSelectImpl(SqlToRelConverter.java:738)
	at org.apache.calcite.sql2rel.SqlToRelConverter.convertSelect(SqlToRelConverter.java:664)
	at org.apache.calcite.sql2rel.SqlToRelConverter.convertQueryRecursive(SqlToRelConverter.java:3589)
	at org.apache.calcite.sql2rel.SqlToRelConverter.convertQuery(SqlToRelConverter.java:589)
	at org.apache.calcite.prepare.PlannerImpl.rel(PlannerImpl.java:259)
{code}

The table could contain N >= 4 columns, and the use of any column at or after index 3 will also cause this exception.
The use of any column  before index 3 gives the RelNode tree:
{code}
42:LogicalProject(EXPR$0=[$0])
  41:LogicalJoin(condition=[=($3, $4)], joinType=[left])
    37:LogicalProject(EXPR$0=[$0], $f0=[$1], $f1=[$2], $f10=[$2])
      36:LogicalJoin(condition=[true], joinType=[inner])
        32:LogicalAggregate(group=[{0}])
          31:LogicalProject(EXPR$0=[CASE(CAST(OR(AND(IS NOT NULL($8), <>($4, 0)), AND(<($5, $4), null, <>($4, 0), IS NULL($8)))):BOOLEAN NOT NULL, 1, 0)])
            30:LogicalJoin(condition=[=($6, $7)], joinType=[left])
              26:LogicalProject(Column_0=[$0], Column_1=[$1], Column_2=[$2], Column_3=[$3], $f0=[$4], $f1=[$5], Column_20=[$2])
                25:LogicalJoin(condition=[true], joinType=[inner])
                  21:TableScan(....)
                  24:LogicalAggregate(group=[{}], agg#0=[COUNT()], agg#1=[COUNT($0)])
                    23:LogicalProject(ROW_VALUE=[$0], $f1=[true])
                      22:LogicalValues(tuples=[[{ 1 }, { 2 }, { 3 }, { 4 }, { 5 }]])
              29:LogicalAggregate(group=[{0}], agg#0=[MIN($1)])
                28:LogicalProject(ROW_VALUE=[$0], $f1=[true])
                  27:LogicalValues(tuples=[[{ 1 }, { 2 }, { 3 }, { 4 }, { 5 }]])
        35:LogicalAggregate(group=[{}], agg#0=[COUNT()], agg#1=[COUNT($0)])
          34:LogicalProject(ROW_VALUE=[$0], $f1=[true])
            33:LogicalValues(tuples=[[{ 1 }, { 2 }, { 3 }, { 4 }, { 5 }]])
    40:LogicalAggregate(group=[{0}], agg#0=[MIN($1)])
      39:LogicalProject(ROW_VALUE=[$0], $f1=[true])
        38:LogicalValues(tuples=[[{ 1 }, { 2 }, { 3 }, { 4 }, { 5 }]])
{code}

If the number of predicates is less than the subquery threshold, there are no issues.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)