You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@calcite.apache.org by "Ruben Q L (Jira)" <ji...@apache.org> on 2019/09/27 07:38:00 UTC

[jira] [Created] (CALCITE-3376) VolcanoPlanner CannotPlanException: best rel is null even though there is an option with non-infinite cost

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)