Skip to content

Commit d6867b2

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

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
@@ -2691,9 +2691,28 @@ private SortNode translateSortNode(AbstractPhysicalSort<? extends Plan> sort, Pl
26912691
private void updateScanSlotsMaterialization(ScanNode scanNode,
26922692
Set<SlotId> requiredSlotIdSet, Set<SlotId> requiredByProjectSlotIdSet,
26932693
PlanTranslatorContext context) {
2694+
Set<SlotId> requiredWithVirtualColumns = Sets.newHashSet(requiredSlotIdSet);
2695+
for (SlotDescriptor virtualSlot : scanNode.getTupleDesc().getSlots()) {
2696+
Expr virtualColumn = virtualSlot.getVirtualColumn();
2697+
if (virtualColumn == null) {
2698+
continue;
2699+
}
2700+
Set<Expr> slotRefs = Sets.newHashSet();
2701+
virtualColumn.collect(e -> e instanceof SlotRef, slotRefs);
2702+
Set<SlotId> virtualColumnInputSlotIds = slotRefs.stream()
2703+
.filter(s -> s instanceof SlotRef)
2704+
.map(s -> (SlotRef) s)
2705+
.map(SlotRef::getSlotId)
2706+
.collect(Collectors.toSet());
2707+
for (SlotDescriptor slot : scanNode.getTupleDesc().getSlots()) {
2708+
if (virtualColumnInputSlotIds.contains(slot.getId()) && slot.getColumn() != null) {
2709+
requiredWithVirtualColumns.add(slot.getId());
2710+
}
2711+
}
2712+
}
26942713
// TODO: use smallest slot if do not need any slot in upper node
26952714
SlotDescriptor smallest = scanNode.getTupleDesc().getSlots().get(0);
2696-
scanNode.getTupleDesc().getSlots().removeIf(s -> !requiredSlotIdSet.contains(s.getId()));
2715+
scanNode.getTupleDesc().getSlots().removeIf(s -> !requiredWithVirtualColumns.contains(s.getId()));
26972716
if (scanNode.getTupleDesc().getSlots().isEmpty()) {
26982717
scanNode.getTupleDesc().getSlots().add(smallest);
26992718
}

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
@@ -1901,6 +1901,24 @@ public void updateRequiredSlots(PlanTranslatorContext context,
19011901
outputColumnUniqueIds.add(slot.getColumn().getUniqueId());
19021902
}
19031903
}
1904+
for (SlotDescriptor virtualSlot : context.getTupleDesc(this.getTupleId()).getSlots()) {
1905+
Expr virtualColumn = virtualSlot.getVirtualColumn();
1906+
if (virtualColumn == null) {
1907+
continue;
1908+
}
1909+
Set<Expr> slotRefs = Sets.newHashSet();
1910+
virtualColumn.collect(e -> e instanceof SlotRef, slotRefs);
1911+
Set<SlotId> virtualColumnInputSlotIds = slotRefs.stream()
1912+
.filter(s -> s instanceof SlotRef)
1913+
.map(s -> (SlotRef) s)
1914+
.map(SlotRef::getSlotId)
1915+
.collect(Collectors.toSet());
1916+
for (SlotDescriptor slot : context.getTupleDesc(this.getTupleId()).getSlots()) {
1917+
if (virtualColumnInputSlotIds.contains(slot.getId()) && slot.getColumn() != null) {
1918+
outputColumnUniqueIds.add(slot.getColumn().getUniqueId());
1919+
}
1920+
}
1921+
}
19041922
}
19051923

19061924
@Override

0 commit comments

Comments
 (0)