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 <[email protected]>
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: [email protected]
For additional commands, e-mail: [email protected]