[ https://issues.apache.org/jira/browse/CALCITE-3979?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17106670#comment-17106670 ]
Zoltan Haindrich commented on CALCITE-3979: ------------------------------------------- I see - this logic is org.eigenbase old - so it was there from the begining; and it was most probably worked more or less correctly until RexNode.equals got fixed. I've taken a look at other places - I've seen a few interesting situations; but they should work correctly. > Simplification might have removed CAST expression(s) incorrectly > ---------------------------------------------------------------- > > Key: CALCITE-3979 > URL: https://issues.apache.org/jira/browse/CALCITE-3979 > Project: Calcite > Issue Type: Bug > Components: core > Affects Versions: 1.22.0 > Reporter: Shuo Cheng > Assignee: Zoltan Haindrich > Priority: Critical > Labels: pull-request-available > Fix For: 1.23.0 > > Time Spent: 0.5h > Remaining Estimate: 0h > > {code:java} > @Test public void testCastRemove() throws Exception { > final String sql = "select\n" + > "case when cast(ename as double) < 5 then 0.0\n" + > " else coalesce(cast(ename as double), 1.0)\n" + > " end as t\n" + > " from (\n" + > " select\n" + > " case when ename > 'abc' then ename\n" + > " else null\n" + > " end as ename from emp\n" + > " )"; > sql(sql).withRule(ReduceExpressionsRule.PROJECT_INSTANCE).check(); > } > {code} > As shown in the above test case, `cast(ename as double) < 5` was reduced as > `ename < 5` when reducing expression, which lead to the following exception: > {code:java} > java.math.BigDecimal cannot be cast to > org.apache.calcite.util.NlsStringjava.math.BigDecimal cannot be cast to > org.apache.calcite.util.NlsStringjava.lang.ClassCastException: > java.math.BigDecimal cannot be cast to org.apache.calcite.util.NlsString at > org.apache.calcite.util.NlsString.compareTo(NlsString.java:47) at > com.google.common.collect.Range.compareOrThrow(Range.java:672) at > com.google.common.collect.Cut.compareTo(Cut.java:79) at > com.google.common.collect.Range.isConnected(Range.java:526) at > org.apache.calcite.rex.RexSimplify.residue(RexSimplify.java:1702) at > org.apache.calcite.rex.RexSimplify.simplifyUsingPredicates(RexSimplify.java:1636) > at > org.apache.calcite.rex.RexSimplify.simplifyComparison(RexSimplify.java:451) > at > org.apache.calcite.rex.RexSimplify.simplifyComparison(RexSimplify.java:321) > at org.apache.calcite.rex.RexSimplify.simplify(RexSimplify.java:292) at > org.apache.calcite.rex.RexSimplify.simplifyAndTerms(RexSimplify.java:492) at > org.apache.calcite.rex.RexSimplify.simplifyAnd(RexSimplify.java:1275) at > org.apache.calcite.rex.RexSimplify.simplify(RexSimplify.java:264) at > org.apache.calcite.rex.RexSimplify.simplifyCase(RexSimplify.java:992) at > org.apache.calcite.rex.RexSimplify.simplify(RexSimplify.java:270) at > org.apache.calcite.rex.RexSimplify.simplifyCase(RexSimplify.java:926) at > org.apache.calcite.rex.RexSimplify.simplify(RexSimplify.java:270) at > org.apache.calcite.rex.RexSimplify.simplifyUnknownAs(RexSimplify.java:235) at > org.apache.calcite.rex.RexSimplify.simplifyPreservingType(RexSimplify.java:174) > at > org.apache.calcite.rel.rules.ReduceExpressionsRule.reduceExpressions(ReduceExpressionsRule.java:629) > at > org.apache.calcite.rel.rules.ReduceExpressionsRule$ProjectReduceExpressionsRule.onMatch(ReduceExpressionsRule.java:305) > at > org.apache.calcite.plan.AbstractRelOptPlanner.fireRule(AbstractRelOptPlanner.java:338) > {code} -- This message was sent by Atlassian Jira (v8.3.4#803005)