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

[jira] [Created] (CALCITE-7400) PruneJoinSingleValue rule causes type mismatch in IN

Zhen Chen created CALCITE-7400:
----------------------------------

             Summary: PruneJoinSingleValue rule causes type mismatch in IN
                 Key: CALCITE-7400
                 URL: https://issues.apache.org/jira/browse/CALCITE-7400
             Project: Calcite
          Issue Type: Bug
          Components: core
    Affects Versions: 1.41.0
            Reporter: Zhen Chen
            Assignee: Zhen Chen
             Fix For: 1.42.0


Using CoreQuidemTest2 to test the following SQL will result in an error.
{code:java}
select 1 in (values(null), (null));
+--------+
| EXPR$0 |
+--------+
|        |
+--------+
(1 row)

!ok {code}
Error message:

> Caused by: java.lang.RuntimeException: Error occurred while applying rule PruneJoinSingleValueRule(left)
>     at org.apache.calcite.plan.volcano.VolcanoRuleCall.transformTo(VolcanoRuleCall.java:157)
>     at org.apache.calcite.plan.RelOptRuleCall.transformTo(RelOptRuleCall.java:273)
>     at org.apache.calcite.plan.RelOptRuleCall.transformTo(RelOptRuleCall.java:288)
>     at org.apache.calcite.rel.rules.SingleValuesOptimizationRules$PruneSingleValueRule.onMatch(SingleValuesOptimizationRules.java:276)
>     at org.apache.calcite.rel.rules.SingleValuesOptimizationRules$JoinLeftSingleRuleConfig$1.onMatch(SingleValuesOptimizationRules.java:343)
>     at org.apache.calcite.plan.volcano.VolcanoRuleCall.onMatch(VolcanoRuleCall.java:223)
>     ... 24 more
> Caused by: java.lang.IllegalArgumentException: Type mismatch:
> rel rowtype: RecordType(BOOLEAN $f0, INTEGER EXPR$0) NOT NULL
> equiv rowtype: RecordType(INTEGER NOT NULL ZERO, BOOLEAN markCol) NOT NULL
> Difference:
> $f0: BOOLEAN -> INTEGER NOT NULL
> EXPR$0: INTEGER -> BOOLEAN

 

The plan before PruneJoinSingleValueRule(left) processing is as follows.
{code:java}
LogicalProject(EXPR$0=[$1])
  LogicalJoin(condition=[=(1, $1)], joinType=[left_mark])
    LogicalValues(tuples=[[{ 0 }]])
    LogicalValues(tuples=[[{ null }, { null }]]) {code}
I believe we should prohibit this scenario. To remove JOIN, we would need to add operators like AGG to the right child for more complex processing, and it's uncertain whether this would increase costs.



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