From 0720367e506e8b7b51c469cded21d605a5f95fa6 Mon Sep 17 00:00:00 2001 From: yangtao555 Date: Sun, 17 May 2026 00:46:28 +0800 Subject: [PATCH] [fix](fe) Preserve operative slots when deep copying logical relations --- .../nereids/trees/copier/LogicalPlanDeepCopier.java | 2 +- .../trees/copier/LogicalPlanDeepCopierTest.java | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/copier/LogicalPlanDeepCopier.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/copier/LogicalPlanDeepCopier.java index 9cedf73486d2b8..db7be1b7721cee 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/copier/LogicalPlanDeepCopier.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/copier/LogicalPlanDeepCopier.java @@ -482,7 +482,7 @@ private void updateReplaceMapWithOutput(Plan oldPlan, Plan newPlan, Map oldOperativeSlots = oldRelation.getOperativeSlots(); List newOperativeSlots = new ArrayList<>(oldOperativeSlots.size()); - int outputSize = oldOperativeSlots.size(); + int outputSize = oldRelation.getOutput().size(); for (Slot opSlot : oldOperativeSlots) { int idx; for (idx = 0; idx < outputSize; idx++) { diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/copier/LogicalPlanDeepCopierTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/copier/LogicalPlanDeepCopierTest.java index 80842f6271ba54..98f07698a9ef29 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/copier/LogicalPlanDeepCopierTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/copier/LogicalPlanDeepCopierTest.java @@ -50,6 +50,17 @@ public void testDeepCopyOlapScan() { } } + @Test + public void testDeepCopyOlapScanWithNonFirstOperativeSlot() { + LogicalOlapScan relationPlan = PlanConstructor.newLogicalOlapScan(0, "a", 0); + relationPlan = (LogicalOlapScan) relationPlan.withOperativeSlots( + ImmutableList.of(relationPlan.getOutput().get(1))); + LogicalOlapScan aCopy = + (LogicalOlapScan) relationPlan.accept(LogicalPlanDeepCopier.INSTANCE, new DeepCopierContext()); + + Assertions.assertEquals(ImmutableList.of(aCopy.getOutput().get(1)), aCopy.getOperativeSlots()); + } + @Test public void testDeepCopyAggregateWithSourceRepeat() { LogicalOlapScan scan = PlanConstructor.newLogicalOlapScan(0, "t", 0);