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:52:00 UTC

[jira] [Created] (CALCITE-5210) "type mismatch" litmus test failure during during SqlToRelConverter for group-by on `case` having `in` expression predicates exceeding SqlRelConverter.Config InSubQueryThreshold with nullable left-hand-side

Ian Bertolacci created CALCITE-5210:
---------------------------------------

             Summary: "type mismatch" litmus test failure during during SqlToRelConverter for group-by on `case` having `in` expression predicates exceeding SqlRelConverter.Config InSubQueryThreshold with nullable left-hand-side
                 Key: CALCITE-5210
                 URL: https://issues.apache.org/jira/browse/CALCITE-5210
             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 (nullable = true)

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

The exception is:
{code}
jjava.lang.AssertionError: type mismatch:
ref:
BIGINT
input:
INTEGER NOT NULL
java.lang.AssertionError: type mismatch:
ref:
BIGINT
input:
INTEGER NOT NULL
	at org.apache.calcite.util.Litmus$1.fail(Litmus.java:32)
	at org.apache.calcite.plan.RelOptUtil.eq(RelOptUtil.java:2211)
	at org.apache.calcite.rex.RexChecker.visitInputRef(RexChecker.java:129)
	at org.apache.calcite.rex.RexChecker.visitInputRef(RexChecker.java:61)
	at org.apache.calcite.rex.RexInputRef.accept(RexInputRef.java:114)
	at org.apache.calcite.rel.core.Project.isValid(Project.java:219)
	at org.apache.calcite.rel.core.Project.<init>(Project.java:98)
	at org.apache.calcite.rel.logical.LogicalProject.<init>(LogicalProject.java:69)
	at org.apache.calcite.rel.logical.LogicalProject.create(LogicalProject.java:126)
	at org.apache.calcite.rel.logical.LogicalProject.create(LogicalProject.java:114)
	at org.apache.calcite.rel.core.RelFactories$ProjectFactoryImpl.createProject(RelFactories.java:178)
	at org.apache.calcite.tools.RelBuilder.project_(RelBuilder.java:2025)
	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  >= 0 columns, and the use of any column below index 3 will also cause this exception.
The use of any column at or beyond index 3 triggers an exception described in CALCITE-5209.

If the number of predicates is less than the subquery threshold, there are no issues, and produces the RelNode tree:
{code}
24:LogicalAggregate(group=[{0}])
  23:LogicalProject(EXPR$0=[CASE(SEARCH($0, Sarg[1L:BIGINT, 2L:BIGINT, 3L:BIGINT, 4L:BIGINT]:BIGINT), 1, 0)])
    22:TableScan(...)
{code}

Additionally, the below queries also produce RelNode trees
Using an alias:
{code}
select
    case
        when Column_0 in (1, 2, 3, 4, 5) THEN 1
        else 0
    end as CASE_ALIAS
from T1000
group by
    CASE_ALIAS
{code}
{code}
66:LogicalAggregate(group=[{0}])
  65:LogicalProject(CASE_ALIAS=[CASE(AND(<>($1, 0), IS NOT NULL($5)), 1, 0)])
    64:LogicalJoin(condition=[=($3, $4)], joinType=[left])
      60:LogicalProject(Column_0=[$0], $f0=[$1], $f1=[$2], Column_00=[$0])
        59:LogicalJoin(condition=[true], joinType=[inner])
          55:TableScan(...)
          58:LogicalAggregate(group=[{}], agg#0=[COUNT()], agg#1=[COUNT($0)])
            57:LogicalProject(ROW_VALUE=[$0], $f1=[true])
              56:LogicalValues(tuples=[[{ 1 }, { 2 }, { 3 }, { 4 }, { 5 }]])
      63:LogicalAggregate(group=[{0}], agg#0=[MIN($1)])
        62:LogicalProject(ROW_VALUE=[$0], $f1=[true])
          61:LogicalValues(tuples=[[{ 1 }, { 2 }, { 3 }, { 4 }, { 5 }]])
{code}

Not using the group-by value in the projection:
{code}
select
    count(*)
from T1000
group by
    case
        when Column_3 in (1, 2, 3, 4, 5) THEN 1
        else 0
    end
{code}
{code}
92:LogicalProject(EXPR$0=[$1])
  91:LogicalAggregate(group=[{0}], EXPR$0=[COUNT()])
    90:LogicalProject($f0=[CASE(AND(<>($1, 0), IS NOT NULL($5)), 1, 0)])
      89:LogicalJoin(condition=[=($3, $4)], joinType=[left])
        85:LogicalProject(Column_0=[$0], $f0=[$1], $f1=[$2], Column_00=[$0])
          84:LogicalJoin(condition=[true], joinType=[inner])
            80:TableScan(...)
            83:LogicalAggregate(group=[{}], agg#0=[COUNT()], agg#1=[COUNT($0)])
              82:LogicalProject(ROW_VALUE=[$0], $f1=[true])
                81:LogicalValues(tuples=[[{ 1 }, { 2 }, { 3 }, { 4 }, { 5 }]])
        88:LogicalAggregate(group=[{0}], agg#0=[MIN($1)])
          87:LogicalProject(ROW_VALUE=[$0], $f1=[true])
            86:LogicalValues(tuples=[[{ 1 }, { 2 }, { 3 }, { 4 }, { 5 }]])
{code}




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