Volodymyr Vysotskyi created CALCITE-2223:
--------------------------------------------
Summary: 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
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}
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)