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)