[ 
https://issues.apache.org/jira/browse/CALCITE-3979?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17104116#comment-17104116
 ] 

Julian Hyde commented on CALCITE-3979:
--------------------------------------

Removing casts concerning equality is dangerous, if the cast is lossy, or if 
the cast may throw.

Removing casts concerning ordering is even more dangerous. In addition to 
lossiness, we have to worry that the domains have different orderings. For 
example, '9' > '11' but 9 < 11, so it is not valid to convert "cast(a as real) 
< cast(b as real)" to "a < b".

So, should we start from the other direction: when do we know for sure that 
removing a cast is safe?

> 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: Major
>              Labels: pull-request-available
>             Fix For: 1.23.0
>
>          Time Spent: 20m
>  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)

Reply via email to