This is an automated email from the ASF dual-hosted git repository. starocean999 pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/master by this push: new 8e7b51470a8 [fix](nereids)forbid some join reorder rules for mark join (#31966) 8e7b51470a8 is described below commit 8e7b51470a8b34e5f8c4c7a4a8d88993c4c670d1 Author: starocean999 <40539150+starocean...@users.noreply.github.com> AuthorDate: Fri Mar 8 10:15:05 2024 +0800 [fix](nereids)forbid some join reorder rules for mark join (#31966) --- .../doris/nereids/rules/exploration/join/JoinCommute.java | 5 +++-- .../rules/exploration/join/LogicalJoinSemiJoinTranspose.java | 7 +++++++ .../join/LogicalJoinSemiJoinTransposeProject.java | 7 +++++++ .../main/java/org/apache/doris/nereids/util/JoinUtils.java | 12 ++++++++++++ 4 files changed, 29 insertions(+), 2 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/JoinCommute.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/JoinCommute.java index ef8868998e0..49c91b92942 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/JoinCommute.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/JoinCommute.java @@ -63,8 +63,9 @@ public class JoinCommute extends OneExplorationRuleFactory { // null aware mark join will be translated to null aware left semi/anti join // we don't support null aware right semi/anti join, so should not commute .whenNot(join -> JoinUtils.isNullAwareMarkJoin(join)) - // commuting nest loop mark join is not supported by be - .whenNot(join -> join.isMarkJoin() && join.getHashJoinConjuncts().isEmpty()) + // commuting nest loop mark join or left anti mark join is not supported by be + .whenNot(join -> join.isMarkJoin() && (join.getHashJoinConjuncts().isEmpty() + || join.getJoinType().isLeftAntiJoin())) .then(join -> { LogicalJoin<Plan, Plan> newJoin = join.withTypeChildren(join.getJoinType().swap(), join.right(), join.left(), null); diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/LogicalJoinSemiJoinTranspose.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/LogicalJoinSemiJoinTranspose.java index 7f0409e45e6..9482d719451 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/LogicalJoinSemiJoinTranspose.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/LogicalJoinSemiJoinTranspose.java @@ -23,6 +23,7 @@ import org.apache.doris.nereids.rules.exploration.ExplorationRuleFactory; import org.apache.doris.nereids.trees.plans.GroupPlan; import org.apache.doris.nereids.trees.plans.Plan; import org.apache.doris.nereids.trees.plans.logical.LogicalJoin; +import org.apache.doris.nereids.util.JoinUtils; import com.google.common.collect.ImmutableList; @@ -46,6 +47,9 @@ public class LogicalJoinSemiJoinTranspose implements ExplorationRuleFactory { .whenNot(topJoin -> topJoin.hasDistributeHint() || topJoin.left().hasDistributeHint()) .then(topJoin -> { LogicalJoin<GroupPlan, GroupPlan> bottomJoin = topJoin.left(); + if (!JoinUtils.checkReorderPrecondition(topJoin, bottomJoin)) { + return null; + } GroupPlan a = bottomJoin.left(); GroupPlan b = bottomJoin.right(); GroupPlan c = topJoin.right(); @@ -61,6 +65,9 @@ public class LogicalJoinSemiJoinTranspose implements ExplorationRuleFactory { .whenNot(topJoin -> topJoin.hasDistributeHint() || topJoin.right().hasDistributeHint()) .then(topJoin -> { LogicalJoin<GroupPlan, GroupPlan> bottomJoin = topJoin.right(); + if (!JoinUtils.checkReorderPrecondition(topJoin, bottomJoin)) { + return null; + } GroupPlan a = topJoin.left(); GroupPlan b = bottomJoin.left(); GroupPlan c = bottomJoin.right(); diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/LogicalJoinSemiJoinTransposeProject.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/LogicalJoinSemiJoinTransposeProject.java index 3b2c6e0dbc7..0240fc99586 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/LogicalJoinSemiJoinTransposeProject.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/LogicalJoinSemiJoinTransposeProject.java @@ -24,6 +24,7 @@ import org.apache.doris.nereids.rules.exploration.ExplorationRuleFactory; import org.apache.doris.nereids.trees.plans.GroupPlan; import org.apache.doris.nereids.trees.plans.Plan; import org.apache.doris.nereids.trees.plans.logical.LogicalJoin; +import org.apache.doris.nereids.util.JoinUtils; import com.google.common.collect.ImmutableList; @@ -48,6 +49,9 @@ public class LogicalJoinSemiJoinTransposeProject implements ExplorationRuleFacto .when(join -> join.left().isAllSlots()) .then(topJoin -> { LogicalJoin<GroupPlan, GroupPlan> bottomJoin = topJoin.left().child(); + if (!JoinUtils.checkReorderPrecondition(topJoin, bottomJoin)) { + return null; + } GroupPlan a = bottomJoin.left(); GroupPlan b = bottomJoin.right(); GroupPlan c = topJoin.right(); @@ -68,6 +72,9 @@ public class LogicalJoinSemiJoinTransposeProject implements ExplorationRuleFacto .when(join -> join.right().isAllSlots()) .then(topJoin -> { LogicalJoin<GroupPlan, GroupPlan> bottomJoin = topJoin.right().child(); + if (!JoinUtils.checkReorderPrecondition(topJoin, bottomJoin)) { + return null; + } GroupPlan a = topJoin.left(); GroupPlan b = bottomJoin.left(); GroupPlan c = bottomJoin.right(); diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/util/JoinUtils.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/util/JoinUtils.java index 3c439f8b99f..07274cc27c6 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/util/JoinUtils.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/util/JoinUtils.java @@ -29,6 +29,7 @@ import org.apache.doris.nereids.rules.rewrite.ForeignKeyContext; import org.apache.doris.nereids.trees.expressions.EqualPredicate; import org.apache.doris.nereids.trees.expressions.ExprId; import org.apache.doris.nereids.trees.expressions.Expression; +import org.apache.doris.nereids.trees.expressions.MarkJoinSlotReference; import org.apache.doris.nereids.trees.expressions.Not; import org.apache.doris.nereids.trees.expressions.Slot; import org.apache.doris.nereids.trees.expressions.functions.scalar.BitmapContains; @@ -392,4 +393,15 @@ public class JoinUtils { // and translate join type to NULL_AWARE_LEFT_SEMI_JOIN or NULL_AWARE_LEFT_ANTI_JOIN return join.getHashJoinConjuncts().isEmpty() && !join.getMarkJoinConjuncts().isEmpty(); } + + /** + * forbid join reorder if top join's condition use mark join slot produced by bottom join + */ + public static boolean checkReorderPrecondition(LogicalJoin<?, ?> top, LogicalJoin<?, ?> bottom) { + Set<Slot> markSlots = top.getConditionSlot().stream() + .filter(MarkJoinSlotReference.class::isInstance) + .collect(Collectors.toSet()); + markSlots.retainAll(bottom.getOutputSet()); + return markSlots.isEmpty(); + } } --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org