Skip to content

Commit 2576d6b

Browse files
branch-3.0: [Bug](intersect) fix wrong result of intersect with null literal #50951 (#51178)
Cherry-picked from #50951 Co-authored-by: Pxl <xl@selectdb.com>
1 parent bb2c737 commit 2576d6b

File tree

4 files changed

+675
-80
lines changed

4 files changed

+675
-80
lines changed

fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PullUpPredicates.java

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import org.apache.doris.nereids.trees.expressions.EqualTo;
2222
import org.apache.doris.nereids.trees.expressions.Expression;
2323
import org.apache.doris.nereids.trees.expressions.InPredicate;
24+
import org.apache.doris.nereids.trees.expressions.IsNull;
2425
import org.apache.doris.nereids.trees.expressions.NamedExpression;
2526
import org.apache.doris.nereids.trees.expressions.Slot;
2627
import org.apache.doris.nereids.trees.expressions.functions.agg.AggregateFunction;
@@ -134,7 +135,7 @@ public ImmutableSet<Expression> visitLogicalOneRowRelation(LogicalOneRowRelation
134135
Set<Expression> predicates = new LinkedHashSet<>();
135136
for (NamedExpression expr : r.getProjects()) {
136137
if (expr instanceof Alias && expr.child(0) instanceof Literal) {
137-
predicates.add(new EqualTo(expr.toSlot(), expr.child(0)));
138+
predicates.add(generateEqual(expr));
138139
}
139140
}
140141
return ImmutableSet.copyOf(predicates);
@@ -262,7 +263,7 @@ public ImmutableSet<Expression> visitLogicalProject(LogicalProject<? extends Pla
262263
}
263264
for (NamedExpression expr : project.getProjects()) {
264265
if (expr instanceof Alias && expr.child(0) instanceof Literal) {
265-
allPredicates.add(new EqualTo(expr.toSlot(), expr.child(0)));
266+
allPredicates.add(generateEqual(expr));
266267
}
267268
}
268269
return getAvailableExpressions(allPredicates, project);
@@ -379,4 +380,13 @@ private ImmutableSet<Expression> getFiltersFromUnionConstExprs(LogicalUnion unio
379380
}
380381
return ImmutableSet.copyOf(filtersFromConstExprs);
381382
}
383+
384+
private Expression generateEqual(NamedExpression expr) {
385+
// IsNull have better performance and compatibility than NullSafeEqualTo
386+
if (expr.child(0) instanceof NullLiteral) {
387+
return new IsNull(expr.toSlot());
388+
} else {
389+
return new EqualTo(expr.toSlot(), expr.child(0));
390+
}
391+
}
382392
}

0 commit comments

Comments
 (0)