From 033f7223646ffe59a2ba6486ac1bdb9b498d5c91 Mon Sep 17 00:00:00 2001 From: morrySnow Date: Tue, 23 Jun 2026 10:01:11 +0800 Subject: [PATCH] [fix](subquery) eliminate null aware by mistake (#64639) ### What problem does this PR solve? Related PR: #30133 Problem Summary: The original PR eliminate null aware with a wrong way to produce wrong result under some cases. This PR remove this optimization and will take by it in a correct way in next PR. --- .../rules/analysis/SubqueryToApply.java | 25 +++++++------------ 1 file changed, 9 insertions(+), 16 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/SubqueryToApply.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/SubqueryToApply.java index d98d1dfcd1dc15..8e05e6e3926cef 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/SubqueryToApply.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/SubqueryToApply.java @@ -118,22 +118,15 @@ public List buildRules() { ctx.statementContext, shouldOutputMarkJoinSlot.get(i)); SubqueryContext context = new SubqueryContext(subqueryExprs); Expression conjunct = replaceSubquery.replace(oldConjuncts.get(i), context); - /* - * the idea is replacing each mark join slot with null and false literal - * then run FoldConstant rule, if the evaluate result are: - * 1. all true - * 2. all null and false (in logicalFilter, we discard both null and false values) - * the mark slot can be non-nullable boolean - * we pass this info to LogicalApply. And in InApplyToJoin rule - * if it's semi join with non-null mark slot - * we can safely change the mark conjunct to hash conjunct - */ - ExpressionRewriteContext rewriteContext = new ExpressionRewriteContext(ctx.cascadesContext); - boolean isMarkSlotNotNull = conjunct.containsType(MarkJoinSlotReference.class) - ? ExpressionUtils.canInferNotNullForMarkSlot( - TrySimplifyPredicateWithMarkJoinSlot.INSTANCE.rewrite(conjunct, - rewriteContext), rewriteContext) - : false; + // TODO: The way to optimize null aware mark join is not right. + // remove it temporary until we refactor it. + // ExpressionRewriteContext rewriteContext = new ExpressionRewriteContext(ctx.cascadesContext); + // boolean isMarkSlotNotNull = conjunct.containsType(MarkJoinSlotReference.class) + // ? ExpressionUtils.canInferNotNullForMarkSlot( + // TrySimplifyPredicateWithMarkJoinSlot.INSTANCE.rewrite(conjunct, + // rewriteContext), rewriteContext) + // : false; + boolean isMarkSlotNotNull = false; Pair> result = subqueryToApply(subqueryExprs.stream() .collect(ImmutableList.toImmutableList()), tmpPlan, context.getSubqueryToMarkJoinSlot(),