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 16:46:00 UTC
[jira] [Created] (CALCITE-2223) ProjectMergeRule is infinitely
matched when is applied after ProjectReduceExpressionsRule
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)