[
https://issues.apache.org/jira/browse/CALCITE-2026?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16234485#comment-16234485
]
Jesus Camacho Rodriguez commented on CALCITE-2026:
--------------------------------------------------
Hive philosophy makes much harder to reason about the optimizations that can be
applied to a given expression, so I am not advocating for that indeed.
I would like to preserve the nullability property, it helps us reasoning about
the optimizations can be applied to a given expression. I was just referring to
the change in the planner of the assumption "expression A generates an
equivalent expression b with same nullability properties for its fields". The
predicates concept is interesting and more generally applicable, but if I
understand correctly, that would be an addition to the aforementioned change,
i.e., we relax the nullability check but we enforce it through predicates,
right? The advantage to keep the nullability boolean around would be that it is
quick and easy to reason about it, the propagation of these constraints would
add an additional overhead to the optimization process that we should probably
take into account. I will relax the check and run some local tests to see what
that gives, maybe create an additional JIRA depending on the outcome.
> AssertionError when ProjectReduceExpressionsRule simplifies project
> expressions
> -------------------------------------------------------------------------------
>
> Key: CALCITE-2026
> URL: https://issues.apache.org/jira/browse/CALCITE-2026
> Project: Calcite
> Issue Type: Bug
> Components: core
> Reporter: Volodymyr Vysotskyi
> Assignee: Julian Hyde
> Priority: Major
>
> When applying ProjectReduceExpressionsRule on project which expression has a
> non-nullable type, but after simplifying expression is null, the query fails
> with the assertion error:
> {noformat}
> java.lang.AssertionError: Type mismatch:
> rel rowtype:
> RecordType(INTEGER EXPR$0) NOT NULL
> equivRel rowtype:
> RecordType(INTEGER NOT NULL EXPR$0) NOT NULL
> at org.apache.calcite.util.Litmus$1.fail(Litmus.java:31)
> ~[calcite-core-1.13.0.jar:1.13.0]
> at org.apache.calcite.plan.RelOptUtil.equal(RelOptUtil.java:1868)
> ~[calcite-core-1.13.0.jar:1.13.0]
> at
> org.apache.calcite.plan.volcano.VolcanoPlanner.register(VolcanoPlanner.java:855)
> ~[calcite-core-1.13.0.jar:1.13.0]
> at
> org.apache.calcite.plan.volcano.VolcanoPlanner.ensureRegistered(VolcanoPlanner.java:883)
> ~[calcite-core-1.13.0.jar:1.13.0]
> at
> org.apache.calcite.plan.volcano.VolcanoPlanner.ensureRegistered(VolcanoPlanner.java:1767)
> ~[calcite-core-1.13.0.jar:1.13.0]
> at
> org.apache.calcite.plan.volcano.VolcanoRuleCall.transformTo(VolcanoRuleCall.java:135)
> ~[calcite-core-1.13.0.jar:1.13.0]
> at
> org.apache.calcite.plan.RelOptRuleCall.transformTo(RelOptRuleCall.java:234)
> ~[calcite-core-1.13.0.jar:1.13.0]
> at
> org.apache.calcite.rel.rules.ReduceExpressionsRule$ProjectReduceExpressionsRule.onMatch(ReduceExpressionsRule.java:268)
> ~[calcite-core-1.13.0.jar:1.13.0]
> at
> org.apache.calcite.plan.volcano.VolcanoRuleCall.onMatch(VolcanoRuleCall.java:212)
> ~[calcite-core-1.13.0.jar:1.13.0]
> at
> org.apache.calcite.plan.volcano.VolcanoPlanner.findBestExp(VolcanoPlanner.java:650)
> ~[calcite-core-1.13.0.jar:1.13.0]
> at
> org.apache.calcite.tools.Programs$RuleSetProgram.run(Programs.java:368)
> ~[calcite-core-1.13.0.jar:1.13.0]
> {noformat}
> The similar bug was described in CALCITE-1502, since there was a problem with
> non-nullable and nullable types in different case branches, but this bug
> appears when project expression is transformed into the expression with
> nullable type.
--
This message was sent by Atlassian JIRA
(v6.4.14#64029)