You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@calcite.apache.org by "Volodymyr Vysotskyi (JIRA)" <ji...@apache.org> on 2018/03/25 17:01:00 UTC

[jira] [Updated] (CALCITE-2223) ProjectMergeRule is infinitely matched when is applied after ProjectReduceExpressionsRule

     [ https://issues.apache.org/jira/browse/CALCITE-2223?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Volodymyr Vysotskyi updated CALCITE-2223:
-----------------------------------------
    Description: 
For queries like this:
{code:sql}
select t1.f from (select cast(f as int) f, f from (select cast(f as int) f from (values('1')) t(f))) as t1
{code}
OOM is thrown when {{ProjectMergeRule}} is applied before applying {{ProjectReduceExpressionsRule}} in VolcanoPlanner.
 A simple test to reproduce this issue (in {{RelOptRulesTest}}):
{code:java}
  @Test public void testOomProjectMergeRule() {
    RelBuilder relBuilder = RelBuilder.create(RelBuilderTest.config().build());
    RelNode relNode = relBuilder
        .values(new String[]{"f"}, "1")
        .project(
            relBuilder.alias(
                relBuilder.cast(relBuilder.field(0), SqlTypeName.INTEGER),
                "f"))
        .project(
            relBuilder.alias(
                relBuilder.cast(relBuilder.field(0), SqlTypeName.INTEGER),
                "f0"),
            relBuilder.alias(relBuilder.field(0), "f"))
        .project(
            relBuilder.alias(relBuilder.field(0), "f"))
        .build();

    RelOptPlanner planner = relNode.getCluster().getPlanner();
    RuleSet ruleSet =
        RuleSets.ofList(
            ReduceExpressionsRule.PROJECT_INSTANCE,
            new ProjectMergeRuleWithLongerName(),
            EnumerableRules.ENUMERABLE_PROJECT_RULE,
            EnumerableRules.ENUMERABLE_VALUES_RULE);
    Program program = Programs.of(ruleSet);

    RelTraitSet toTraits =
        relNode.getCluster().traitSet()
            .replace(0, EnumerableConvention.INSTANCE);

    RelNode output = program.run(planner, relNode, toTraits,
        ImmutableList.<RelOptMaterialization>of(), ImmutableList.<RelOptLattice>of());

    // check for output
  }

  /**
   * ProjectMergeRule inheritor which has
   * class name greater than ProjectReduceExpressionsRule class name (String.compareTo()).
   *
   * It is needed for RuleQueue.popMatch() method
   * to apply this rule before ProjectReduceExpressionsRule.
   */
  private static class ProjectMergeRuleWithLongerName extends ProjectMergeRule {
    public ProjectMergeRuleWithLongerName() {
      super(true, RelFactories.LOGICAL_BUILDER);
    }
  }
{code}

  was:
For queries like this:
{code:sql}
select t1.f from (select cast(f as int) f, f from (select cast(f as int) f from (values('1')) t(f))) as t1
{code}
OOM is thrown when {{ProjectMergeRule}} is applied before applying {{ProjectReduceExpressionsRule}} in VolcanoPlanner.
 A simple test to reproduce this issue:
{code:java}
  @Test public void testOomProjectMergeRule() {
    RelBuilder relBuilder = RelBuilder.create(RelBuilderTest.config().build());
    RelNode relNode = relBuilder
        .values(new String[]{"f"}, "1")
        .project(
            relBuilder.alias(
                relBuilder.cast(relBuilder.field(0), SqlTypeName.INTEGER),
                "f"))
        .project(
            relBuilder.alias(
                relBuilder.cast(relBuilder.field(0), SqlTypeName.INTEGER),
                "f0"),
            relBuilder.alias(relBuilder.field(0), "f"))
        .project(
            relBuilder.alias(relBuilder.field(0), "f"))
        .build();

    RelOptPlanner planner = relNode.getCluster().getPlanner();
    RuleSet ruleSet =
        RuleSets.ofList(
            ReduceExpressionsRule.PROJECT_INSTANCE,
            new ProjectMergeRuleWithLongerName(),
            EnumerableRules.ENUMERABLE_PROJECT_RULE,
            EnumerableRules.ENUMERABLE_VALUES_RULE);
    Program program = Programs.of(ruleSet);

    RelTraitSet toTraits =
        relNode.getCluster().traitSet()
            .replace(0, EnumerableConvention.INSTANCE);

    RelNode output = program.run(planner, relNode, toTraits,
        ImmutableList.<RelOptMaterialization>of(), ImmutableList.<RelOptLattice>of());

    // check for output
  }

  /**
   * ProjectMergeRule inheritor which has
   * class name longer than ProjectReduceExpressionsRule class name.
   *
   * It is needed for RuleQueue.popMatch() method
   * to apply this rule before ProjectReduceExpressionsRule.
   */
  private static class ProjectMergeRuleWithLongerName extends ProjectMergeRule {
    public ProjectMergeRuleWithLongerName() {
      super(true, RelFactories.LOGICAL_BUILDER);
    }
  }
{code}


> ProjectMergeRule is infinitely matched when is applied after ProjectReduceExpressionsRule
> -----------------------------------------------------------------------------------------
>
>                 Key: CALCITE-2223
>                 URL: https://issues.apache.org/jira/browse/CALCITE-2223
>             Project: Calcite
>          Issue Type: Bug
>            Reporter: Volodymyr Vysotskyi
>            Assignee: Julian Hyde
>            Priority: Critical
>
> For queries like this:
> {code:sql}
> select t1.f from (select cast(f as int) f, f from (select cast(f as int) f from (values('1')) t(f))) as t1
> {code}
> OOM is thrown when {{ProjectMergeRule}} is applied before applying {{ProjectReduceExpressionsRule}} in VolcanoPlanner.
>  A simple test to reproduce this issue (in {{RelOptRulesTest}}):
> {code:java}
>   @Test public void testOomProjectMergeRule() {
>     RelBuilder relBuilder = RelBuilder.create(RelBuilderTest.config().build());
>     RelNode relNode = relBuilder
>         .values(new String[]{"f"}, "1")
>         .project(
>             relBuilder.alias(
>                 relBuilder.cast(relBuilder.field(0), SqlTypeName.INTEGER),
>                 "f"))
>         .project(
>             relBuilder.alias(
>                 relBuilder.cast(relBuilder.field(0), SqlTypeName.INTEGER),
>                 "f0"),
>             relBuilder.alias(relBuilder.field(0), "f"))
>         .project(
>             relBuilder.alias(relBuilder.field(0), "f"))
>         .build();
>     RelOptPlanner planner = relNode.getCluster().getPlanner();
>     RuleSet ruleSet =
>         RuleSets.ofList(
>             ReduceExpressionsRule.PROJECT_INSTANCE,
>             new ProjectMergeRuleWithLongerName(),
>             EnumerableRules.ENUMERABLE_PROJECT_RULE,
>             EnumerableRules.ENUMERABLE_VALUES_RULE);
>     Program program = Programs.of(ruleSet);
>     RelTraitSet toTraits =
>         relNode.getCluster().traitSet()
>             .replace(0, EnumerableConvention.INSTANCE);
>     RelNode output = program.run(planner, relNode, toTraits,
>         ImmutableList.<RelOptMaterialization>of(), ImmutableList.<RelOptLattice>of());
>     // check for output
>   }
>   /**
>    * ProjectMergeRule inheritor which has
>    * class name greater than ProjectReduceExpressionsRule class name (String.compareTo()).
>    *
>    * It is needed for RuleQueue.popMatch() method
>    * to apply this rule before ProjectReduceExpressionsRule.
>    */
>   private static class ProjectMergeRuleWithLongerName extends ProjectMergeRule {
>     public ProjectMergeRuleWithLongerName() {
>       super(true, RelFactories.LOGICAL_BUILDER);
>     }
>   }
> {code}



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)