Moritz Mack created CALCITE-5503:
------------------------------------
Summary: Memoize visited nodes in CheapestPlanReplacer
Key: CALCITE-5503
URL: https://issues.apache.org/jira/browse/CALCITE-5503
Project: Calcite
Issue Type: Improvement
Components: core
Reporter: Moritz Mack
When using CheapestPlanReplacer, semantics of a RelNode tree change if it
contains the same node multiple times in case this node has inputs itself that
have to be replaced. During replacement such nodes get copied on each
occurrence.
Instead CheapestPlanReplacer should memoize previously visited nodes and emit
the same result again in the that case.
The test case below illustrates the issue and fails on the current main branch.
{code:java}
@Test void testMemoizeInputRelNodes() {
VolcanoPlanner planner = new VolcanoPlanner();
planner.addRelTraitDef(ConventionTraitDef.INSTANCE);
RelOptCluster cluster = newCluster(planner);
// The rule that triggers the assert rule
planner.addRule(PhysLeafRule.INSTANCE);
planner.addRule(GoodSingleRule.INSTANCE);
// Leaf RelNode
NoneLeafRel leafRel = new NoneLeafRel(cluster, "a");
RelNode leafPhy = planner
.changeTraits(leafRel, cluster.traitSetOf(PHYS_CALLING_CONVENTION));
// RelNode with leaf RelNode as single input
NoneSingleRel singleRel = new NoneSingleRel(cluster, leafPhy);
RelNode singlePhy = planner
.changeTraits(singleRel, cluster.traitSetOf(PHYS_CALLING_CONVENTION));
// Binary RelNode with identical input on either side
PhysBiRel parent = new PhysBiRel(
cluster, cluster.traitSetOf(PHYS_CALLING_CONVENTION), singlePhy,
singlePhy);
planner.setRoot(parent);
RelNode result = planner.chooseDelegate().findBestExp();
// Expect inputs to remain identical
assertEquals(result.getInput(0), result.getInput(1));
} {code}
--
This message was sent by Atlassian Jira
(v8.20.10#820010)