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)

Reply via email to