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

CannotPlanException when an empty LogicalValues requires a certain collation

Rank to TopRank to BottomBulk Copy AttachmentsBulk Move AttachmentsVotersWatch issueWatchersConvert to sub-taskLinkCloneUpdate Comment AuthorReplace String in CommentUpdate Comment VisibilityDelete Comments
    XMLWordPrintableJSON

Details

    Description

      The issue can be reproduced with the following test (in RelBuilderTest.java):

        @Test void testEmptyValues() throws Exception {
          final RelBuilder builder = RelBuilder.create(config().build());
          final RelNode root =
              builder
                  .scan("DEPT")
                  .filter(builder.literal(false)) // generates an empty LogicalValues
                  .sort(
                      builder.field("DNAME"),
                      builder.field("DEPTNO"))
                  .build();
          try (PreparedStatement preparedStatement = RelRunners.run(root)) {
            final String s = CalciteAssert.toString(preparedStatement.executeQuery());
            final String result = "";
            assertThat(s, is(result));
          }
        }
      

      The test fails with the following message:

      Caused by: org.apache.calcite.plan.RelOptPlanner$CannotPlanException: There are not enough rules to produce a node with desired properties: convention=ENUMERABLE, sort=[1, 0].
      Missing conversion is LogicalValues[convention: NONE -> ENUMERABLE, sort: [[0, 1, 2], [1, 2], [2]] -> [1, 0]]
      There is 1 empty subset: rel#14:Subset#0.ENUMERABLE.[1, 0], the relevant part of the original plan is as follows
      1:LogicalValues(tuples=[[]])
      

      The issue seems to be caused by the empty values: Scan + Filter(false) => LogicalValues(tuples=[[]]).
      This empty LogicalValues has as collation (in case of 3 fields): [[0, 1, 2], [1, 2], [2]]; and in the plan we are requesting as sort collation [1, 0].
      This could be achieved by: EnumerableSort(sort=[1,0]) + EnumerableValues(tuples=[[]]) ; but for some reason this plan is not generated.

      It seems the issue was somehow introduced by CALCITE-3886
      https://github.com/apache/calcite/commit/08f4a9889728f94903ff424ed9c20d940b821af5

      Attachments

        Issue Links

        Activity

          This comment will be Viewable by All Users Viewable by All Users
          Cancel

          People

            rubenql Ruben Q L
            rubenql Ruben Q L
            Votes:
            0 Vote for this issue
            Watchers:
            4 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved:

              Time Tracking

                Estimated:
                Original Estimate - Not Specified
                Not Specified
                Remaining:
                Remaining Estimate - 0h
                0h
                Logged:
                Time Spent - 8h 20m
                8h 20m

                Slack

                  Issue deployment