[fix](nereids) fix rf info missing for set op (#21367)

During physical set operation translation, we forget to inherit rf related info from set op children, which will lead the merge filter error and get a long waittime.
This commit is contained in:
xzj7019
2023-06-30 18:50:29 +08:00
committed by GitHub
parent 88cbea2b56
commit 164448dac3
2 changed files with 7 additions and 7 deletions

View File

@ -1224,7 +1224,7 @@ public class PhysicalPlanTranslator extends DefaultPlanVisitor<PlanFragment, Pla
setPlanRoot(leftFragment, nestedLoopJoinNode, nestedLoopJoin);
// TODO: what's this? do we really need to set this?
rightFragment.getPlanRoot().setCompactData(false);
context.removePlanFragment(rightFragment);
context.mergePlanFragment(rightFragment, leftFragment);
for (PlanFragment rightChild : rightFragment.getChildren()) {
leftFragment.addChild(rightChild);
}
@ -1557,7 +1557,7 @@ public class PhysicalPlanTranslator extends DefaultPlanVisitor<PlanFragment, Pla
int childrenSize = childrenFragments.size();
setOperationFragment = childrenFragments.get(childrenSize - 1);
for (int i = childrenSize - 2; i >= 0; i--) {
context.removePlanFragment(childrenFragments.get(i));
context.mergePlanFragment(childrenFragments.get(i), setOperationFragment);
for (PlanFragment child : childrenFragments.get(i).getChildren()) {
setOperationFragment.addChild(child);
}
@ -1995,9 +1995,7 @@ public class PhysicalPlanTranslator extends DefaultPlanVisitor<PlanFragment, Pla
hashJoinNode.setChild(0, leftFragment.getPlanRoot());
hashJoinNode.setChild(1, rightFragment.getPlanRoot());
setPlanRoot(leftFragment, hashJoinNode, join);
rightFragment.getTargetRuntimeFilterIds().forEach(leftFragment::setTargetRuntimeFilterIds);
rightFragment.getBuilderRuntimeFilterIds().forEach(leftFragment::setBuilderRuntimeFilterIds);
context.removePlanFragment(rightFragment);
context.mergePlanFragment(rightFragment, leftFragment);
for (PlanFragment rightChild : rightFragment.getChildren()) {
leftFragment.addChild(rightChild);
}

View File

@ -137,8 +137,10 @@ public class PlanTranslatorContext {
slotIdToExprId.put(slotRef.getDesc().getId(), exprId);
}
public void removePlanFragment(PlanFragment planFragment) {
this.planFragments.remove(planFragment);
public void mergePlanFragment(PlanFragment srcFragment, PlanFragment targetFragment) {
srcFragment.getTargetRuntimeFilterIds().forEach(targetFragment::setTargetRuntimeFilterIds);
srcFragment.getBuilderRuntimeFilterIds().forEach(targetFragment::setBuilderRuntimeFilterIds);
this.planFragments.remove(srcFragment);
}
public SlotRef findSlotRef(ExprId exprId) {