You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@calcite.apache.org by "Danny Chen (Jira)" <ji...@apache.org> on 2021/01/27 08:02:00 UTC

[jira] [Created] (CALCITE-4479) "vFloat in (1.0, 2.0)" throws UnsupportedOperationException

Danny Chen created CALCITE-4479:
-----------------------------------

             Summary: "vFloat in (1.0, 2.0)" throws UnsupportedOperationException
                 Key: CALCITE-4479
                 URL: https://issues.apache.org/jira/browse/CALCITE-4479
             Project: Calcite
          Issue Type: Bug
          Components: core
    Affects Versions: 1.26.0
            Reporter: Danny Chen
            Assignee: Danny Chen
             Fix For: 1.27.0


Check this test in {{RexBuilderTest}}:

{code:java}
@Test void testMakeIn() {
    final RelDataTypeFactory typeFactory =
            new SqlTypeFactoryImpl(RelDataTypeSystem.DEFAULT);
    final RexBuilder rexBuilder = new RexBuilder(typeFactory);
    final RelDataType floatType = typeFactory.createSqlType(SqlTypeName.FLOAT);
    RexNode left = rexBuilder.makeInputRef(floatType, 0);
    final RexNode literal1 = rexBuilder.makeLiteral(1.0f, floatType);
    final RexNode literal2 = rexBuilder.makeLiteral(2.0f, floatType);
    RexNode inCall = rexBuilder.makeIn(left, ImmutableList.of(literal1, literal2));
    assertThat(inCall.getKind(), is(SqlKind.SEARCH));
  }
{code}

The stacktrace is:

{noformat}
class org.apache.calcite.sql.type.SqlTypeName: FLOAT
java.lang.UnsupportedOperationException: class org.apache.calcite.sql.type.SqlTypeName: FLOAT
	at org.apache.calcite.util.Util.needToImplement(Util.java:1085)
	at org.apache.calcite.rex.RexLiteral.appendAsJava(RexLiteral.java:726)
	at org.apache.calcite.rex.RexLiteral.toJavaString(RexLiteral.java:427)
	at org.apache.calcite.rex.RexLiteral.computeDigest(RexLiteral.java:289)
	at org.apache.calcite.rex.RexLiteral.<init>(RexLiteral.java:233)
	at org.apache.calcite.rex.RexLiteral.toLiteral(RexLiteral.java:762)
	at org.apache.calcite.rex.RexLiteral.lambda$printSarg$4(RexLiteral.java:733)
	at org.apache.calcite.util.RangeSets$Printer.singleton(RangeSets.java:409)
	at org.apache.calcite.util.RangeSets.forEach(RangeSets.java:249)
	at org.apache.calcite.util.Sarg.lambda$printTo$0(Sarg.java:119)
	at org.apache.calcite.linq4j.Ord.forEach(Ord.java:157)
	at org.apache.calcite.util.Sarg.printTo(Sarg.java:115)
	at org.apache.calcite.rex.RexLiteral.printSarg(RexLiteral.java:732)
	at org.apache.calcite.rex.RexLiteral.lambda$appendAsJava$1(RexLiteral.java:673)
	at org.apache.calcite.util.Util.asStringBuilder(Util.java:2525)
	at org.apache.calcite.rex.RexLiteral.appendAsJava(RexLiteral.java:672)
	at org.apache.calcite.rex.RexLiteral.toJavaString(RexLiteral.java:427)
	at org.apache.calcite.rex.RexLiteral.computeDigest(RexLiteral.java:289)
	at org.apache.calcite.rex.RexLiteral.<init>(RexLiteral.java:233)
	at org.apache.calcite.rex.RexBuilder.makeLiteral(RexBuilder.java:990)
	at org.apache.calcite.rex.RexBuilder.makeSearchArgumentLiteral(RexBuilder.java:1085)
	at org.apache.calcite.rex.RexBuilder.makeIn(RexBuilder.java:1335)
	at org.apache.calcite.rex.RexBuilderTest.testMakeIn(RexBuilderTest.java:621)
{noformat}

The root cause is that {{RexLiteral#strictTypeName}} has different type name strategies with what {{RexBuilder.makeLiteral}} follows, the best way to fix is to make the rules synced, but here i only give a simple fix because the code path only used for Sarg digest.



--
This message was sent by Atlassian Jira
(v8.3.4#803005)