Stamatis Zampetakis created CALCITE-7201:
--------------------------------------------

             Summary: ClassCastException in RexInterpreter#search with 
different NUMERIC values
                 Key: CALCITE-7201
                 URL: https://issues.apache.org/jira/browse/CALCITE-7201
             Project: Calcite
          Issue Type: Bug
          Components: core
    Affects Versions: 1.40.0
            Reporter: Stamatis Zampetakis
            Assignee: Stamatis Zampetakis


{{RexInterpreter}} throws {{ClassCastException}} when evaluating {{SEARCH}} 
calls with NUMERIC arguments that don't have the same Class in their runtime 
representation. The most vivid example is when we compare approximate numerics 
with exact numerics.

+Example+
{code:sql}
SELECT 10035e-2 IN (100, 200) AS foo;
{code}
The approximate numerics are internally represented using Double while exact 
numerics are represented using BigDecimal. The easiest way to reproduce the 
problem is through the simplifier which internally calls the interpreter.

The following test can be added in {{{}RexProgramTest{}}}:
{code:java}
@Test void testSimplifySearch() {
    RexNode d100_35 = rexBuilder.makeApproxLiteral(100.35, 
typeFactory.createSqlType(SqlTypeName.DOUBLE));
    RexNode d100 = rexBuilder.makeExactLiteral(BigDecimal.valueOf(100), 
typeFactory.createSqlType(SqlTypeName.INTEGER));
    RexNode d200 = rexBuilder.makeExactLiteral(BigDecimal.valueOf(200), 
typeFactory.createSqlType(SqlTypeName.INTEGER));
    checkSimplify(rexBuilder.makeIn(d100_35, Arrays.asList(d100, d200)),"");
  }
{code}
{noformat}
class java.math.BigDecimal cannot be cast to class java.lang.Double 
(java.math.BigDecimal and java.lang.Double are in module java.base of loader 
'bootstrap')
java.lang.ClassCastException: class java.math.BigDecimal cannot be cast to 
class java.lang.Double (java.math.BigDecimal and java.lang.Double are in module 
java.base of loader 'bootstrap')
        at java.base/java.lang.Double.compareTo(Double.java:216)
        at com.google.common.collect.Range.compareOrThrow(Range.java:715)
        at com.google.common.collect.Cut.compareTo(Cut.java:79)
        at com.google.common.collect.Cut$BelowValue.compareTo(Cut.java:313)
        at 
com.google.common.collect.NaturalOrdering.compare(NaturalOrdering.java:42)
        at 
com.google.common.collect.NaturalOrdering.compare(NaturalOrdering.java:29)
        at 
com.google.common.collect.SortedLists.binarySearch(SortedLists.java:291)
        at 
com.google.common.collect.SortedLists.binarySearch(SortedLists.java:244)
        at 
com.google.common.collect.ImmutableRangeSet.rangeContaining(ImmutableRangeSet.java:197)
        at 
com.google.common.collect.AbstractRangeSet.contains(AbstractRangeSet.java:32)
        at 
com.google.common.collect.ImmutableRangeSet.contains(ImmutableRangeSet.java:54)
        at org.apache.calcite.rex.RexInterpreter.search(RexInterpreter.java:319)
        at 
org.apache.calcite.rex.RexInterpreter.visitCall(RexInterpreter.java:246)
        at 
org.apache.calcite.rex.RexInterpreter.visitCall(RexInterpreter.java:58)
        at org.apache.calcite.rex.RexCall.accept(RexCall.java:208)
        at 
org.apache.calcite.rex.RexInterpreter.evaluate(RexInterpreter.java:91)
        at org.apache.calcite.rex.RexSimplify.verify(RexSimplify.java:2300)
        at 
org.apache.calcite.rex.RexSimplify.simplifyUnknownAs(RexSimplify.java:255)
        at 
org.apache.calcite.rex.RexProgramTestBase.checkSimplifyAs(RexProgramTestBase.java:147)
        at 
org.apache.calcite.rex.RexProgramTestBase.checkSimplify3_(RexProgramTestBase.java:131)
        at 
org.apache.calcite.rex.RexProgramTestBase.checkSimplify(RexProgramTestBase.java:90)
        at 
org.apache.calcite.rex.RexProgramTest.testSimplifySearch(RexProgramTest.java:853)
{noformat}
 



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

Reply via email to