diff --git a/be/src/exec/exec_node.cpp b/be/src/exec/exec_node.cpp index a71eaa9da0..679d42c21d 100644 --- a/be/src/exec/exec_node.cpp +++ b/be/src/exec/exec_node.cpp @@ -143,10 +143,12 @@ ExecNode::~ExecNode() { void ExecNode::push_down_predicate( RuntimeState* state, std::list* expr_ctxs) { - for (int i = 0; i < _children.size(); ++i) { - _children[i]->push_down_predicate(state, expr_ctxs); - if (expr_ctxs->size() == 0) { - return; + if (_type != TPlanNodeType::AGGREGATION_NODE) { + for (int i = 0; i < _children.size(); ++i) { + _children[i]->push_down_predicate(state, expr_ctxs); + if (expr_ctxs->size() == 0) { + return; + } } } diff --git a/fe/src/main/java/org/apache/doris/planner/DistributedPlanner.java b/fe/src/main/java/org/apache/doris/planner/DistributedPlanner.java index d2cd3f1c91..891510240c 100644 --- a/fe/src/main/java/org/apache/doris/planner/DistributedPlanner.java +++ b/fe/src/main/java/org/apache/doris/planner/DistributedPlanner.java @@ -360,13 +360,13 @@ public class DistributedPlanner { connectChildFragment(node, 1, leftChildFragment, rightChildFragment); leftChildFragment.setPlanRoot(node); - if (!node.getJoinOp().isOuterJoin() && !node.getJoinOp().isSemiAntiJoin()) { + // Push down the predicates constructed by the right child when the + // join op is inner join or left semi join. + if (node.getJoinOp().isInnerJoin() || node.getJoinOp().isLeftSemiJoin()) { node.setIsPushDown(true); - } - // semi-join, only left semi join can pushDown - if (node.getJoinOp().isLeftSemiJoin()) { - node.setIsPushDown(true); - } + } else { + node.setIsPushDown(false); + } return leftChildFragment; } else { node.setDistributionMode(HashJoinNode.DistributionMode.PARTITIONED);