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 <[email protected]>
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: [email protected]
For additional commands, e-mail: [email protected]