This is an automated email from the ASF dual-hosted git repository. lihaopeng pushed a commit to branch repair_outer_join_0714 in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/repair_outer_join_0714 by this push: new 79a464bd95 semi/anti join + empty other conjuncts = semi copy (#10857) 79a464bd95 is described below commit 79a464bd955d08fa3425aafc47e8be664be25bda Author: EmmyMiao87 <522274...@qq.com> AuthorDate: Thu Jul 14 19:55:39 2022 +0800 semi/anti join + empty other conjuncts = semi copy (#10857) --- .../org/apache/doris/planner/HashJoinNode.java | 53 +++++++++++++++------- 1 file changed, 37 insertions(+), 16 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/HashJoinNode.java b/fe/fe-core/src/main/java/org/apache/doris/planner/HashJoinNode.java index 7eda81014a..78eb563ec7 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/planner/HashJoinNode.java +++ b/fe/fe-core/src/main/java/org/apache/doris/planner/HashJoinNode.java @@ -554,6 +554,8 @@ public class HashJoinNode extends PlanNode { vIntermediateTupleDescList.add(vIntermediateRightTupleDesc); boolean leftNullable = false; boolean rightNullable = false; + boolean copyleft = true; + boolean copyRight = true; switch (joinOp) { case LEFT_OUTER_JOIN: rightNullable = true; @@ -565,6 +567,19 @@ public class HashJoinNode extends PlanNode { leftNullable = true; rightNullable = true; break; + case LEFT_ANTI_JOIN: + case LEFT_SEMI_JOIN: + case NULL_AWARE_LEFT_ANTI_JOIN: + if (otherJoinConjuncts == null || otherJoinConjuncts.isEmpty()) { + copyRight = false; + } + break; + case RIGHT_SEMI_JOIN: + case RIGHT_ANTI_JOIN: + if (otherJoinConjuncts == null || otherJoinConjuncts.isEmpty()) { + copyleft = false; + } + break; default: break; } @@ -572,28 +587,34 @@ public class HashJoinNode extends PlanNode { ExprSubstitutionMap originToIntermediateSmap = new ExprSubstitutionMap(); Map<List<TupleId>, TupleId> originTidsToIntermediateTidMap = Maps.newHashMap(); // left - originTidsToIntermediateTidMap.put(getChild(0).getOutputTupleIds(), vIntermediateLeftTupleDesc.getId()); - for (TupleDescriptor tupleDescriptor : analyzer.getDescTbl().getTupleDesc(getChild(0).getOutputTupleIds())) { - for (SlotDescriptor slotDescriptor : tupleDescriptor.getMaterializedSlots()) { - SlotDescriptor intermediateSlotDesc = - analyzer.getDescTbl().copySlotDescriptor(vIntermediateLeftTupleDesc, slotDescriptor); - if (leftNullable) { - intermediateSlotDesc.setIsNullable(true); + if (copyleft) { + originTidsToIntermediateTidMap.put(getChild(0).getOutputTupleIds(), vIntermediateLeftTupleDesc.getId()); + for (TupleDescriptor tupleDescriptor : analyzer.getDescTbl() + .getTupleDesc(getChild(0).getOutputTupleIds())) { + for (SlotDescriptor slotDescriptor : tupleDescriptor.getMaterializedSlots()) { + SlotDescriptor intermediateSlotDesc = + analyzer.getDescTbl().copySlotDescriptor(vIntermediateLeftTupleDesc, slotDescriptor); + if (leftNullable) { + intermediateSlotDesc.setIsNullable(true); + } + originToIntermediateSmap.put(new SlotRef(slotDescriptor), new SlotRef(intermediateSlotDesc)); } - originToIntermediateSmap.put(new SlotRef(slotDescriptor), new SlotRef(intermediateSlotDesc)); } } vIntermediateLeftTupleDesc.computeMemLayout(); // right - originTidsToIntermediateTidMap.put(getChild(1).getOutputTupleIds(), vIntermediateRightTupleDesc.getId()); - for (TupleDescriptor tupleDescriptor : analyzer.getDescTbl().getTupleDesc(getChild(1).getOutputTupleIds())) { - for (SlotDescriptor slotDescriptor : tupleDescriptor.getMaterializedSlots()) { - SlotDescriptor intermediateSlotDesc = - analyzer.getDescTbl().copySlotDescriptor(vIntermediateRightTupleDesc, slotDescriptor); - if (rightNullable) { - intermediateSlotDesc.setIsNullable(true); + if (copyRight) { + originTidsToIntermediateTidMap.put(getChild(1).getOutputTupleIds(), vIntermediateRightTupleDesc.getId()); + for (TupleDescriptor tupleDescriptor : analyzer.getDescTbl() + .getTupleDesc(getChild(1).getOutputTupleIds())) { + for (SlotDescriptor slotDescriptor : tupleDescriptor.getMaterializedSlots()) { + SlotDescriptor intermediateSlotDesc = + analyzer.getDescTbl().copySlotDescriptor(vIntermediateRightTupleDesc, slotDescriptor); + if (rightNullable) { + intermediateSlotDesc.setIsNullable(true); + } + originToIntermediateSmap.put(new SlotRef(slotDescriptor), new SlotRef(intermediateSlotDesc)); } - originToIntermediateSmap.put(new SlotRef(slotDescriptor), new SlotRef(intermediateSlotDesc)); } } vIntermediateRightTupleDesc.computeMemLayout(); --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org