[fix](nereids) runtime filter prune skip filter with invisible column (#28010)

if a conjunct only contains invisible column, this conjunct should not be used in runtime filter pruner
This commit is contained in:
minghong
2023-12-06 12:42:40 +08:00
committed by GitHub
parent 24fdb7ad4e
commit a0fee4c96e
2 changed files with 95 additions and 1 deletions

View File

@ -22,6 +22,7 @@ import org.apache.doris.nereids.trees.expressions.EqualTo;
import org.apache.doris.nereids.trees.expressions.ExprId;
import org.apache.doris.nereids.trees.expressions.Expression;
import org.apache.doris.nereids.trees.expressions.Slot;
import org.apache.doris.nereids.trees.expressions.SlotReference;
import org.apache.doris.nereids.trees.plans.AbstractPlan;
import org.apache.doris.nereids.trees.plans.Plan;
import org.apache.doris.nereids.trees.plans.physical.PhysicalAssertNumRows;
@ -103,10 +104,26 @@ public class RuntimeFilterPruner extends PlanPostProcessor {
return join;
}
private boolean isVisibleColumn(Slot slot) {
if (slot instanceof SlotReference) {
SlotReference slotReference = (SlotReference) slot;
if (slotReference.getColumn().isPresent()) {
return slotReference.getColumn().get().isVisible();
}
}
return true;
}
@Override
public PhysicalFilter visitPhysicalFilter(PhysicalFilter<? extends Plan> filter, CascadesContext context) {
filter.child().accept(this, context);
context.getRuntimeFilterContext().addEffectiveSrcNode(filter);
boolean visibleFilter = filter.getExpressions().stream()
.flatMap(expression -> expression.getInputSlots().stream())
.anyMatch(slot -> isVisibleColumn(slot));
if (visibleFilter) {
// skip filters like: __DORIS_DELETE_SIGN__ = 0
context.getRuntimeFilterContext().addEffectiveSrcNode(filter);
}
return filter;
}