[ https://issues.apache.org/jira/browse/CALCITE-2223?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16737242#comment-16737242 ]
Vladimir Sitnikov commented on CALCITE-2223: -------------------------------------------- [~vvysotskyi], re PushProjector, there's an issue similar to CALCITE-2343 The case there is query like the following: {code:java} select name, count(name) over () from ( select name from emps union all select name from depts ){code} is transformed to something like {code:java} select name, count(e.ename) over () from ( select name, count(e.ename) over () from emps e join depts d on e.deptid=d.id ){code} and it causes infinite planning since the rule basically expands the query on each invocation. I wonder if you hit a similar case. I guess PushProjector should learn to avoid pushing of certain calls (e.g. over). {quote} MaterializationTest reproduces the similar problem{quote} I believe it is a different issue since Materialization is inherent to produce the results with infinite match possibility. For instance, suppose there's a query Q1. Suppose we create a materialization M1 = "select * from Q1 where x>42" then "select * from Q1" is replaced with {code:sql} select * from M1 union all select * from Q1 where x<=42 {code} The replaced SQL still has Q1, so the same materialization could match again. I don't think your case is similar. > 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 > Attachments: heap_overview.png, provenance_contents.png > > > 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)