This is an automated email from the ASF dual-hosted git repository.

kxiao pushed a commit to branch branch-2.0
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/branch-2.0 by this push:
     new 969002bc532 [feature](Nereids): add is null in predicate and put or 
expansion rule in rewriter (#28348) (#28690)
969002bc532 is described below

commit 969002bc532b18e38d5ba1044a9a714162d4dec7
Author: 谢健 <jianx...@gmail.com>
AuthorDate: Wed Dec 20 12:20:59 2023 +0800

    [feature](Nereids): add is null in predicate and put or expansion rule in 
rewriter (#28348) (#28690)
---
 .../org/apache/doris/nereids/jobs/executor/Rewriter.java |  3 +++
 .../java/org/apache/doris/nereids/rules/RuleSet.java     |  2 --
 .../rules/{exploration => rewrite}/OrExpansion.java      | 15 ++++++++++-----
 .../org/apache/doris/nereids/stats/FilterEstimation.java |  2 +-
 regression-test/data/nereids_p0/union/or_expansion.out   | 15 ++++++++++++++-
 .../suites/nereids_p0/union/or_expansion.groovy          | 16 +++++++++++-----
 6 files changed, 39 insertions(+), 14 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/executor/Rewriter.java 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/executor/Rewriter.java
index fcbbdee6ee6..24495ccc620 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/executor/Rewriter.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/executor/Rewriter.java
@@ -78,6 +78,7 @@ import 
org.apache.doris.nereids.rules.rewrite.MergeOneRowRelationIntoUnion;
 import org.apache.doris.nereids.rules.rewrite.MergeProjects;
 import org.apache.doris.nereids.rules.rewrite.MergeSetOperations;
 import org.apache.doris.nereids.rules.rewrite.NormalizeSort;
+import org.apache.doris.nereids.rules.rewrite.OrExpansion;
 import org.apache.doris.nereids.rules.rewrite.PruneEmptyPartition;
 import org.apache.doris.nereids.rules.rewrite.PruneFileScanPartition;
 import org.apache.doris.nereids.rules.rewrite.PruneOlapScanPartition;
@@ -377,6 +378,8 @@ public class Rewriter extends AbstractBatchJobExecutor {
                 topic("rewrite cte sub-tree",
                         custom(RuleType.REWRITE_CTE_CHILDREN, () -> new 
RewriteCteChildren(jobs))
                 ),
+                topic("or expansion",
+                        topDown(new OrExpansion())),
                 topic("whole plan check",
                         custom(RuleType.ADJUST_NULLABLE, AdjustNullable::new)
                 )
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/RuleSet.java 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/RuleSet.java
index dfb00b08b84..b7a43d66984 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/RuleSet.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/RuleSet.java
@@ -18,7 +18,6 @@
 package org.apache.doris.nereids.rules;
 
 import org.apache.doris.nereids.rules.exploration.MergeProjectsCBO;
-import org.apache.doris.nereids.rules.exploration.OrExpansion;
 import org.apache.doris.nereids.rules.exploration.TransposeAggSemiJoin;
 import org.apache.doris.nereids.rules.exploration.TransposeAggSemiJoinProject;
 import org.apache.doris.nereids.rules.exploration.join.InnerJoinLAsscom;
@@ -119,7 +118,6 @@ public class RuleSet {
             .add(PushdownProjectThroughSemiJoin.INSTANCE)
             .add(TransposeAggSemiJoin.INSTANCE)
             .add(TransposeAggSemiJoinProject.INSTANCE)
-            .add(OrExpansion.INSTANCE)
             .build();
 
     public static final List<RuleFactory> PUSH_DOWN_FILTERS = ImmutableList.of(
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/OrExpansion.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/OrExpansion.java
similarity index 95%
rename from 
fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/OrExpansion.java
rename to 
fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/OrExpansion.java
index 9019565142b..fd7e7e844ad 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/OrExpansion.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/OrExpansion.java
@@ -15,15 +15,16 @@
 // specific language governing permissions and limitations
 // under the License.
 
-package org.apache.doris.nereids.rules.exploration;
+package org.apache.doris.nereids.rules.rewrite;
 
 import org.apache.doris.common.Pair;
 import org.apache.doris.nereids.CascadesContext;
 import org.apache.doris.nereids.rules.Rule;
 import org.apache.doris.nereids.rules.RuleType;
-import 
org.apache.doris.nereids.rules.rewrite.PushdownExpressionsInHashCondition;
+import org.apache.doris.nereids.rules.exploration.OneExplorationRuleFactory;
 import org.apache.doris.nereids.trees.expressions.Alias;
 import org.apache.doris.nereids.trees.expressions.Expression;
+import org.apache.doris.nereids.trees.expressions.IsNull;
 import org.apache.doris.nereids.trees.expressions.NamedExpression;
 import org.apache.doris.nereids.trees.expressions.Not;
 import org.apache.doris.nereids.trees.expressions.Slot;
@@ -72,7 +73,7 @@ public class OrExpansion extends OneExplorationRuleFactory {
 
     @Override
     public Rule build() {
-        return logicalJoin().when(JoinUtils::shouldNestedLoopJoin)
+        return logicalJoin(any(), any()).when(JoinUtils::shouldNestedLoopJoin)
                 .when(join -> supportJoinType.contains(join.getJoinType())
                         && 
ConnectContext.get().getSessionVariable().getEnablePipelineEngine())
                 .thenApply(ctx -> {
@@ -82,7 +83,7 @@ public class OrExpansion extends OneExplorationRuleFactory {
 
                     //1. Try to split or conditions
                     Pair<List<Expression>, List<Expression>> 
hashOtherConditions = splitOrCondition(join);
-                    if (hashOtherConditions == null) {
+                    if (hashOtherConditions == null || 
hashOtherConditions.first.size() <= 1) {
                         return join;
                     }
 
@@ -221,7 +222,11 @@ public class OrExpansion extends OneExplorationRuleFactory 
{
             LogicalCTEProducer<? extends Plan> rightProducer) {
         List<Expression> disjunctions = hashOtherConditions.first;
         List<Expression> otherConditions = hashOtherConditions.second;
-        List<Expression> notExprs = 
disjunctions.stream().map(Not::new).collect(Collectors.toList());
+        // For null values, equalTo and not equalTo both return false
+        // To avoid it, we always return true when there is null
+        List<Expression> notExprs = disjunctions.stream()
+                .map(e -> ExpressionUtils.or(new Not(e), new IsNull(e)))
+                .collect(ImmutableList.toImmutableList());
         List<Plan> joins = Lists.newArrayList();
 
         for (int hashCondIdx = 0; hashCondIdx < disjunctions.size(); 
hashCondIdx++) {
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/stats/FilterEstimation.java 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/stats/FilterEstimation.java
index 0a7d6b70c39..9c04b59ce6d 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/stats/FilterEstimation.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/stats/FilterEstimation.java
@@ -367,7 +367,7 @@ public class FilterEstimation extends 
ExpressionVisitor<Statistics, EstimationCo
                 // 4. not A like XXX
                 colBuilder.setNumNulls(0);
                 Preconditions.checkArgument(
-                        child instanceof EqualTo
+                        child instanceof EqualPredicate
                                 || child instanceof InPredicate
                                 || child instanceof IsNull
                                 || child instanceof Like,
diff --git a/regression-test/data/nereids_p0/union/or_expansion.out 
b/regression-test/data/nereids_p0/union/or_expansion.out
index dd82dbbcab7..4779bf2ace1 100644
--- a/regression-test/data/nereids_p0/union/or_expansion.out
+++ b/regression-test/data/nereids_p0/union/or_expansion.out
@@ -1,9 +1,13 @@
 -- This file is automatically generated. You should know what you did if you 
want to edit this
 -- !order_ij --
+\N     \N
+1      \N
+1      1
+1      1
 
 -- !order_laj --
+\N
 0
-1
 2
 3
 4
@@ -14,6 +18,8 @@
 9
 
 -- !order_loj --
+\N     \N
+\N     \N
 0      \N
 1      \N
 2      \N
@@ -24,8 +30,13 @@
 7      \N
 8      \N
 9      \N
+1      1
+1      1
 
 -- !order_foj --
+\N     \N
+\N     \N
+\N     \N
 0      \N
 1      \N
 2      \N
@@ -36,6 +47,8 @@
 7      \N
 8      \N
 9      \N
+1      1
+1      1
 \N     20
 \N     21
 \N     22
diff --git a/regression-test/suites/nereids_p0/union/or_expansion.groovy 
b/regression-test/suites/nereids_p0/union/or_expansion.groovy
index 9139ea65c26..2d68098cd2d 100644
--- a/regression-test/suites/nereids_p0/union/or_expansion.groovy
+++ b/regression-test/suites/nereids_p0/union/or_expansion.groovy
@@ -45,11 +45,6 @@ suite("or_expansion") {
         )
     """
 
-    for (int i = 0; i < 10; i++) {
-        sql "insert into oe1 values(${i}, ${i})"
-        sql "insert into oe2 values(${i+20}, ${i+20})"
-    }
-
     sql """
     alter table oe1 modify column k0 set stats ('row_count'='1000', 
'ndv'='1000', 'min_value'='1', 'max_value'='1000', 'avg_size'='1000', 
'max_size'='1000' )
     """
@@ -99,6 +94,17 @@ suite("or_expansion") {
         contains "VHASH JOIN"
     }
 
+    for (int i = 0; i < 10; i++) {
+        sql "insert into oe1 values(${i}, ${i})"
+        sql "insert into oe2 values(${i+20}, ${i+20})"
+    }
+    sql "insert into oe1 values(null, 1)"
+    sql "insert into oe1 values(1, null)"
+    sql "insert into oe1 values(null, null)"
+    sql "insert into oe2 values(null, 1)"
+    sql "insert into oe2 values(1, null)"
+    sql "insert into oe2 values(null, null)"
+
     qt_order_ij """
         select oe1.k0, oe2.k0
         from oe1 inner join oe2


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to