Skip to content

Commit 88634e9

Browse files
morrySnowzhiqiang-hhhh
authored andcommitted
[fix](vector) column prune is wrong on virtual column (apache#50550)
1 parent e02f131 commit 88634e9

File tree

2 files changed

+38
-1
lines changed

2 files changed

+38
-1
lines changed

fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PhysicalPlanTranslator.java

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2593,9 +2593,28 @@ private SortNode translateSortNode(AbstractPhysicalSort<? extends Plan> sort, Pl
25932593
private void updateScanSlotsMaterialization(ScanNode scanNode,
25942594
Set<SlotId> requiredSlotIdSet, Set<SlotId> requiredByProjectSlotIdSet,
25952595
PlanTranslatorContext context) {
2596+
Set<SlotId> requiredWithVirtualColumns = Sets.newHashSet(requiredSlotIdSet);
2597+
for (SlotDescriptor virtualSlot : scanNode.getTupleDesc().getSlots()) {
2598+
Expr virtualColumn = virtualSlot.getVirtualColumn();
2599+
if (virtualColumn == null) {
2600+
continue;
2601+
}
2602+
Set<Expr> slotRefs = Sets.newHashSet();
2603+
virtualColumn.collect(e -> e instanceof SlotRef, slotRefs);
2604+
Set<SlotId> virtualColumnInputSlotIds = slotRefs.stream()
2605+
.filter(s -> s instanceof SlotRef)
2606+
.map(s -> (SlotRef) s)
2607+
.map(SlotRef::getSlotId)
2608+
.collect(Collectors.toSet());
2609+
for (SlotDescriptor slot : scanNode.getTupleDesc().getSlots()) {
2610+
if (virtualColumnInputSlotIds.contains(slot.getId()) && slot.getColumn() != null) {
2611+
requiredWithVirtualColumns.add(slot.getId());
2612+
}
2613+
}
2614+
}
25962615
// TODO: use smallest slot if do not need any slot in upper node
25972616
SlotDescriptor smallest = scanNode.getTupleDesc().getSlots().get(0);
2598-
scanNode.getTupleDesc().getSlots().removeIf(s -> !requiredSlotIdSet.contains(s.getId()));
2617+
scanNode.getTupleDesc().getSlots().removeIf(s -> !requiredWithVirtualColumns.contains(s.getId()));
25992618
if (scanNode.getTupleDesc().getSlots().isEmpty()) {
26002619
scanNode.getTupleDesc().getSlots().add(smallest);
26012620
}

fe/fe-core/src/main/java/org/apache/doris/planner/OlapScanNode.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1881,6 +1881,24 @@ public void updateRequiredSlots(PlanTranslatorContext context,
18811881
outputColumnUniqueIds.add(slot.getColumn().getUniqueId());
18821882
}
18831883
}
1884+
for (SlotDescriptor virtualSlot : context.getTupleDesc(this.getTupleId()).getSlots()) {
1885+
Expr virtualColumn = virtualSlot.getVirtualColumn();
1886+
if (virtualColumn == null) {
1887+
continue;
1888+
}
1889+
Set<Expr> slotRefs = Sets.newHashSet();
1890+
virtualColumn.collect(e -> e instanceof SlotRef, slotRefs);
1891+
Set<SlotId> virtualColumnInputSlotIds = slotRefs.stream()
1892+
.filter(s -> s instanceof SlotRef)
1893+
.map(s -> (SlotRef) s)
1894+
.map(SlotRef::getSlotId)
1895+
.collect(Collectors.toSet());
1896+
for (SlotDescriptor slot : context.getTupleDesc(this.getTupleId()).getSlots()) {
1897+
if (virtualColumnInputSlotIds.contains(slot.getId()) && slot.getColumn() != null) {
1898+
outputColumnUniqueIds.add(slot.getColumn().getUniqueId());
1899+
}
1900+
}
1901+
}
18841902
}
18851903

18861904
@Override

0 commit comments

Comments
 (0)