This is an automated email from the ASF dual-hosted git repository.
dataroaring pushed a commit to branch branch-3.0
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/branch-3.0 by this push:
new 2576d6be033 branch-3.0: [Bug](intersect) fix wrong result of intersect
with null literal #50951 (#51178)
2576d6be033 is described below
commit 2576d6be0333d548ae3512711cf53d689c09deee
Author: github-actions[bot]
<41898282+github-actions[bot]@users.noreply.github.com>
AuthorDate: Fri May 23 20:19:41 2025 +0800
branch-3.0: [Bug](intersect) fix wrong result of intersect with null
literal #50951 (#51178)
Cherry-picked from #50951
Co-authored-by: Pxl <[email protected]>
---
.../nereids/rules/rewrite/PullUpPredicates.java | 14 +++++-
.../infer_predicate/pull_up_predicate_literal.out | Bin 86132 -> 110312 bytes
.../set_operations/set_with_null/set_with_null.out | Bin 0 -> 123 bytes
.../set_with_null/set_with_null.groovy | 55 +++++++++++++++++++++
4 files changed, 67 insertions(+), 2 deletions(-)
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PullUpPredicates.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PullUpPredicates.java
index 8ced9374bc9..a2d820a9ccd 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PullUpPredicates.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PullUpPredicates.java
@@ -21,6 +21,7 @@ import org.apache.doris.nereids.trees.expressions.Alias;
import org.apache.doris.nereids.trees.expressions.EqualTo;
import org.apache.doris.nereids.trees.expressions.Expression;
import org.apache.doris.nereids.trees.expressions.InPredicate;
+import org.apache.doris.nereids.trees.expressions.IsNull;
import org.apache.doris.nereids.trees.expressions.NamedExpression;
import org.apache.doris.nereids.trees.expressions.Slot;
import
org.apache.doris.nereids.trees.expressions.functions.agg.AggregateFunction;
@@ -134,7 +135,7 @@ public class PullUpPredicates extends
PlanVisitor<ImmutableSet<Expression>, Void
Set<Expression> predicates = new LinkedHashSet<>();
for (NamedExpression expr : r.getProjects()) {
if (expr instanceof Alias && expr.child(0) instanceof Literal)
{
- predicates.add(new EqualTo(expr.toSlot(), expr.child(0)));
+ predicates.add(generateEqual(expr));
}
}
return ImmutableSet.copyOf(predicates);
@@ -262,7 +263,7 @@ public class PullUpPredicates extends
PlanVisitor<ImmutableSet<Expression>, Void
}
for (NamedExpression expr : project.getProjects()) {
if (expr instanceof Alias && expr.child(0) instanceof Literal)
{
- allPredicates.add(new EqualTo(expr.toSlot(),
expr.child(0)));
+ allPredicates.add(generateEqual(expr));
}
}
return getAvailableExpressions(allPredicates, project);
@@ -379,4 +380,13 @@ public class PullUpPredicates extends
PlanVisitor<ImmutableSet<Expression>, Void
}
return ImmutableSet.copyOf(filtersFromConstExprs);
}
+
+ private Expression generateEqual(NamedExpression expr) {
+ // IsNull have better performance and compatibility than
NullSafeEqualTo
+ if (expr.child(0) instanceof NullLiteral) {
+ return new IsNull(expr.toSlot());
+ } else {
+ return new EqualTo(expr.toSlot(), expr.child(0));
+ }
+ }
}
diff --git
a/regression-test/data/nereids_rules_p0/infer_predicate/pull_up_predicate_literal.out
b/regression-test/data/nereids_rules_p0/infer_predicate/pull_up_predicate_literal.out
index 08dee815c3f..88d7fa790d9 100644
Binary files
a/regression-test/data/nereids_rules_p0/infer_predicate/pull_up_predicate_literal.out
and
b/regression-test/data/nereids_rules_p0/infer_predicate/pull_up_predicate_literal.out
differ
diff --git
a/regression-test/data/query_p0/set_operations/set_with_null/set_with_null.out
b/regression-test/data/query_p0/set_operations/set_with_null/set_with_null.out
new file mode 100644
index 00000000000..82bb49e972d
Binary files /dev/null and
b/regression-test/data/query_p0/set_operations/set_with_null/set_with_null.out
differ
diff --git
a/regression-test/suites/query_p0/set_operations/set_with_null/set_with_null.groovy
b/regression-test/suites/query_p0/set_operations/set_with_null/set_with_null.groovy
new file mode 100644
index 00000000000..06a57e1c1b1
--- /dev/null
+++
b/regression-test/suites/query_p0/set_operations/set_with_null/set_with_null.groovy
@@ -0,0 +1,55 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+// The cases is copied from https://github.com/trinodb/trino/tree/master
+//
/testing/trino-product-tests/src/main/resources/sql-tests/testcases/aggregate
+// and modified by Doris.
+
+suite("set_with_null") {
+ sql " drop table if exists d_table;"
+ sql """
+ create table d_table (
+ k1 int null
+ )
+ duplicate key (k1)
+ distributed BY hash(k1) buckets 3
+ properties("replication_num" = "1");
+ """
+ sql "insert into d_table values (null);"
+
+ qt_test """
+ (
+ select k1
+ from d_table
+ )
+ intersect
+ (
+ select null
+ )
+ """
+
+ qt_test """
+ (
+ select k1
+ from d_table
+ )
+ except
+ (
+ select null
+ )
+ """
+}
\ No newline at end of file
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]