[ 
https://issues.apache.org/jira/browse/CALCITE-3926?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17084247#comment-17084247
 ] 

Ruben Q L commented on CALCITE-3926:
------------------------------------

Thanks [~hyuan]. I might be able to provide a patch based on the following 
approach:
- PruneEmptyRules: when converting {{Sort + (Empty)Values => (Empty)Values}} 
the resulting Values should have the sort's collation (we can assume that the 
EmptyValues has been "sorted" following the Sort's collation). This collation 
info would need to be propagated (e.g. from LogicalValues to EnumerableValues 
in EnumerableValuesRule)

> CannotPlanException when an empty LogicalValues requires a certain collation
> ----------------------------------------------------------------------------
>
>                 Key: CALCITE-3926
>                 URL: https://issues.apache.org/jira/browse/CALCITE-3926
>             Project: Calcite
>          Issue Type: Bug
>          Components: core
>    Affects Versions: 1.23.0
>            Reporter: Ruben Q L
>            Priority: Blocker
>
> The issue can be reproduced with the following test (in RelBuilderTest.java):
> {code: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));
>     }
>   }
> {code}
> The test fails with the following message:
> {code:java}
> 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=[[]])
> {code}
> 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]



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

Reply via email to