diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/processor/post/RuntimeFilterContext.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/processor/post/RuntimeFilterContext.java index 585ab5f3d7b081..6e6643140f8973 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/processor/post/RuntimeFilterContext.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/processor/post/RuntimeFilterContext.java @@ -279,6 +279,10 @@ public Pair aliasTransferMapPut(NamedExpression slot, Pa return aliasTransferMap.put(slot, pair); } + public void aliasTransferMapRemove(NamedExpression slot) { + aliasTransferMap.remove(slot); + } + public boolean aliasTransferMapContains(NamedExpression slot) { return aliasTransferMap.containsKey(slot); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/processor/post/RuntimeFilterGenerator.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/processor/post/RuntimeFilterGenerator.java index 57c322d030f8fe..68fca97e7bfe83 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/processor/post/RuntimeFilterGenerator.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/processor/post/RuntimeFilterGenerator.java @@ -37,6 +37,7 @@ import org.apache.doris.nereids.trees.expressions.Slot; import org.apache.doris.nereids.trees.expressions.SlotReference; import org.apache.doris.nereids.trees.expressions.functions.scalar.BitmapContains; +import org.apache.doris.nereids.trees.expressions.literal.Literal; import org.apache.doris.nereids.trees.plans.AbstractPlan; import org.apache.doris.nereids.trees.plans.JoinType; import org.apache.doris.nereids.trees.plans.Plan; @@ -440,6 +441,21 @@ public PhysicalPlan visitPhysicalProject(PhysicalProject project if (expression.children().isEmpty()) { continue; } + /* + * join(#5=#6) + * -->project(null as #5) + * --> any + * -->project(#6) + * --->scan(T[#5, #6]) + * + * both left tree and right tree contain exprId=5. + * remove #5 from alias map to avoid generate wrong rf + */ + if (expression instanceof Alias && expression.child(0) instanceof Literal) { + Alias alias = (Alias) expression; + ctx.aliasTransferMapRemove(alias.toSlot()); + continue; + } Expression expr = ExpressionUtils.getSingleNumericSlotOrExpressionCoveredByCast(expression.child(0)); if (expr instanceof NamedExpression && ctx.aliasTransferMapContains((NamedExpression) expr)) {