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)