Uploaded image for project: 'Calcite'
  1. Calcite
  2. CALCITE-2745

RexSimplify fails with ClassCastException when the expression contains comparisons of operands with different types

Log workAgile BoardRank to TopRank to BottomAttach filesAttach ScreenshotAdd voteVotersWatch issueWatchersCreate sub-taskConvert to sub-taskLinkCloneLabelsUpdate Comment AuthorReplace String in CommentUpdate Comment VisibilityDelete Comments
    XMLWordPrintableJSON

    Details

    • Type: Bug
    • Status: Open
    • Priority: Major
    • Resolution: Unresolved
    • Affects Version/s: None
    • Fix Version/s: None
    • Component/s: None
    • Labels:
      None

      Description

      RexSimplify fails with ClassCastException when the expression contains predicates with comparisons of operands with different types.

      Test to reproduce this issue (placed into JdbcAdapterTest):

        @Test public void testSeveralTypesComparison() {
          CalciteAssert.model(JdbcTest.FOODMART_MODEL)
              .query("SELECT \"full_name\" FROM \"employee\" WHERE "
                  + "\"employee_id\" = '1' and \"employee_id\" > 0")
              .returns("full_name=Sheri Nowmer\n");
        }
      

      It fails with the error:

      Caused by: java.lang.ClassCastException: org.apache.calcite.util.NlsString cannot be cast to java.math.BigDecimal
      	at java.math.BigDecimal.compareTo(BigDecimal.java:220)
      	at org.apache.calcite.rex.RexSimplify.processRange(RexSimplify.java:1780)
      	at org.apache.calcite.rex.RexSimplify.simplifyAnd2ForUnknownAsFalse(RexSimplify.java:1242)
      	at org.apache.calcite.rex.RexSimplify.simplifyAnd2ForUnknownAsFalse(RexSimplify.java:1109)
      	at org.apache.calcite.rex.RexSimplify.simplifyAnds(RexSimplify.java:386)
      	at org.apache.calcite.rex.RexSimplify.simplifyFilterPredicates(RexSimplify.java:2028)
      	at org.apache.calcite.tools.RelBuilder.filter(RelBuilder.java:1048)
      	at org.apache.calcite.tools.RelBuilder.filter(RelBuilder.java:1037)
      	at org.apache.calcite.rel.rules.PushProjector.convertProject(PushProjector.java:382)
      	at org.apache.calcite.rel.rules.ProjectFilterTransposeRule.onMatch(ProjectFilterTransposeRule.java:104)
      	at org.apache.calcite.plan.volcano.VolcanoRuleCall.onMatch(VolcanoRuleCall.java:212)
      	... 41 more
      

      When the query has any of the AND operands, or when ProjectFilterTransposeRule is not applied it is passed.

      Regarding the comparison of different data types, SQL spec says the following:

      8.2 <comparison predicate> Syntax Rules
      3) The declared types of the corresponding fields of the two <row value predicand>s shall be comparable.

      But it also allows implicit casts from numeric types to chars (6.13 <cast specification>).

        Attachments

        Issue Links

          Activity

          $i18n.getText('security.level.explanation', $currentSelection) Viewable by All Users
          Cancel

            People

            • Assignee:
              Unassigned Assign to me
              Reporter:
              volodymyr Vova Vysotskyi

              Dates

              • Created:
                Updated:

                Issue deployment