This is an automated email from the ASF dual-hosted git repository. morrysnow pushed a commit to branch vector-index-dev in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/vector-index-dev by this push: new 8fea358562f [fix](vector) column prune is wrong on virtual column (#50550) 8fea358562f is described below commit 8fea358562f7a4dbfa4c1666bcf232a18bc2b184 Author: morrySnow <zhangwen...@selectdb.com> AuthorDate: Tue Apr 29 20:33:46 2025 +0800 [fix](vector) column prune is wrong on virtual column (#50550) --- .../glue/translator/PhysicalPlanTranslator.java | 21 ++++++++++++++++++++- .../java/org/apache/doris/planner/OlapScanNode.java | 18 ++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PhysicalPlanTranslator.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PhysicalPlanTranslator.java index 2ed49d2fa83..847300d1933 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PhysicalPlanTranslator.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PhysicalPlanTranslator.java @@ -2529,9 +2529,28 @@ public class PhysicalPlanTranslator extends DefaultPlanVisitor<PlanFragment, Pla private void updateScanSlotsMaterialization(ScanNode scanNode, Set<SlotId> requiredSlotIdSet, Set<SlotId> requiredByProjectSlotIdSet, PlanTranslatorContext context) { + Set<SlotId> requiredWithVirtualColumns = Sets.newHashSet(requiredSlotIdSet); + for (SlotDescriptor virtualSlot : scanNode.getTupleDesc().getSlots()) { + Expr virtualColumn = virtualSlot.getVirtualColumn(); + if (virtualColumn == null) { + continue; + } + Set<Expr> slotRefs = Sets.newHashSet(); + virtualColumn.collect(e -> e instanceof SlotRef, slotRefs); + Set<SlotId> virtualColumnInputSlotIds = slotRefs.stream() + .filter(s -> s instanceof SlotRef) + .map(s -> (SlotRef) s) + .map(SlotRef::getSlotId) + .collect(Collectors.toSet()); + for (SlotDescriptor slot : scanNode.getTupleDesc().getSlots()) { + if (virtualColumnInputSlotIds.contains(slot.getId()) && slot.getColumn() != null) { + requiredWithVirtualColumns.add(slot.getId()); + } + } + } // TODO: use smallest slot if do not need any slot in upper node SlotDescriptor smallest = scanNode.getTupleDesc().getSlots().get(0); - scanNode.getTupleDesc().getSlots().removeIf(s -> !requiredSlotIdSet.contains(s.getId())); + scanNode.getTupleDesc().getSlots().removeIf(s -> !requiredWithVirtualColumns.contains(s.getId())); if (scanNode.getTupleDesc().getSlots().isEmpty()) { scanNode.getTupleDesc().getSlots().add(smallest); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/OlapScanNode.java b/fe/fe-core/src/main/java/org/apache/doris/planner/OlapScanNode.java index c7489a172c1..e229a6e1dcb 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/planner/OlapScanNode.java +++ b/fe/fe-core/src/main/java/org/apache/doris/planner/OlapScanNode.java @@ -1870,6 +1870,24 @@ public class OlapScanNode extends ScanNode { outputColumnUniqueIds.add(slot.getColumn().getUniqueId()); } } + for (SlotDescriptor virtualSlot : context.getTupleDesc(this.getTupleId()).getSlots()) { + Expr virtualColumn = virtualSlot.getVirtualColumn(); + if (virtualColumn == null) { + continue; + } + Set<Expr> slotRefs = Sets.newHashSet(); + virtualColumn.collect(e -> e instanceof SlotRef, slotRefs); + Set<SlotId> virtualColumnInputSlotIds = slotRefs.stream() + .filter(s -> s instanceof SlotRef) + .map(s -> (SlotRef) s) + .map(SlotRef::getSlotId) + .collect(Collectors.toSet()); + for (SlotDescriptor slot : context.getTupleDesc(this.getTupleId()).getSlots()) { + if (virtualColumnInputSlotIds.contains(slot.getId()) && slot.getColumn() != null) { + outputColumnUniqueIds.add(slot.getColumn().getUniqueId()); + } + } + } } @Override --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org