Ruben Q L created CALCITE-3376: ---------------------------------- Summary: VolcanoPlanner CannotPlanException: best rel is null even though there is an option with non-infinite cost Key: CALCITE-3376 URL: https://issues.apache.org/jira/browse/CALCITE-3376 Project: Calcite Issue Type: Bug Affects Versions: 1.21.0 Reporter: Ruben Q L Attachments: stackTrace.txt
The problem can be reproduced by adding this test to PlannerTest.java: {code:java} @Test public void testCannotPlanException() throws Exception { RelBuilder builder = RelBuilder.create(RelBuilderTest.config().build()); RuleSet ruleSet = RuleSets.ofList( //EnumerableRules.ENUMERABLE_JOIN_RULE, // with this rule it works! JoinToCorrelateRule.INSTANCE, EnumerableRules.ENUMERABLE_CORRELATE_RULE, EnumerableRules.ENUMERABLE_PROJECT_RULE, EnumerableRules.ENUMERABLE_FILTER_RULE, EnumerableRules.ENUMERABLE_SORT_RULE, EnumerableRules.ENUMERABLE_UNION_RULE, EnumerableRules.ENUMERABLE_TABLE_SCAN_RULE); builder .scan("EMP") .scan("EMP") .union(true) .scan("EMP") .scan("EMP") .union(true) .join( JoinRelType.INNER, builder.equals( builder.field(2, 0, "DEPTNO"), builder.field(2, 1, "EMPNO"))); RelNode relNode = builder.build(); RelOptPlanner planner = relNode.getCluster().getPlanner(); Program program = Programs.of(ruleSet); RelTraitSet toTraits = relNode.getTraitSet() .replace(EnumerableConvention.INSTANCE); RelNode output = program.run(planner, relNode, toTraits, ImmutableList.of(), ImmutableList.of()); String outputStr = toString(output); } {code} Running this test causes the following exception (full stack trace attached): {code:java} org.apache.calcite.plan.RelOptPlanner$CannotPlanException: There are not enough rules to produce a node with desired properties: convention=ENUMERABLE, sort=[]. All the inputs have relevant nodes, however the cost is still infinite. Root: rel#13:Subset#2.ENUMERABLE.[] {code} The last part of the message (_All the inputs have relevant nodes, however the cost is still infinite_) seems relevant, because we can see that {{rel#13}}'s best is {{null}}, and it should be {{rel#21}} (which has a non-infinite cost): {code:java} rel#13:Subset#2.ENUMERABLE.[], best=null, importance=1.0 rel#14:AbstractConverter.ENUMERABLE.[](input=RelSubset#12, convention=ENUMERABLE, sort=[]), rowcount=117.6, cumulative cost={inf} rel#21:EnumerableCorrelate.ENUMERABLE.[](left=RelSubset#19, right=RelSubset#20, correlation=$cor0, joinType=inner, requiredColumns={7}), rowcount=1.0, cumulative cost={1770.6000000000001 rows, 2466.0 cpu, 0.0 io} {code} -- This message was sent by Atlassian Jira (v8.3.4#803005)