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

commit 788420429cf84c03ee166b2fd54701b6f130160a
Author: 924060929 <924060...@qq.com>
AuthorDate: Tue Aug 6 11:23:13 2024 +0800

    [enhancement](nereids) Support eliminate outer join by match expression 
(#38537)
    
    1. enable run match expression outer of filter plan, e.g join conjunct
    2. support eliminate outer join by match expression, if any arguments of
    match expression is null literal
---
 .../nereids/rules/analysis/CheckAfterRewrite.java  | 20 -------------
 .../expression/rules/FoldConstantRuleOnFE.java     | 11 +++++++
 .../rules/expression/rules/PartitionPruner.java    |  2 +-
 regression-test/data/nereids_syntax_p0/match.out   |  8 +++++
 .../suites/nereids_syntax_p0/match.groovy          | 34 +++++++++++++++++++++-
 5 files changed, 53 insertions(+), 22 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/CheckAfterRewrite.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/CheckAfterRewrite.java
index df8ec64fc2e..e193c5fc493 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/CheckAfterRewrite.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/CheckAfterRewrite.java
@@ -24,7 +24,6 @@ import org.apache.doris.nereids.rules.RuleType;
 import org.apache.doris.nereids.trees.expressions.Alias;
 import org.apache.doris.nereids.trees.expressions.ExprId;
 import org.apache.doris.nereids.trees.expressions.Expression;
-import org.apache.doris.nereids.trees.expressions.Match;
 import org.apache.doris.nereids.trees.expressions.NamedExpression;
 import org.apache.doris.nereids.trees.expressions.Slot;
 import org.apache.doris.nereids.trees.expressions.SlotNotFromChildren;
@@ -39,9 +38,6 @@ import 
org.apache.doris.nereids.trees.expressions.functions.window.WindowFunctio
 import org.apache.doris.nereids.trees.plans.Plan;
 import org.apache.doris.nereids.trees.plans.algebra.Generate;
 import org.apache.doris.nereids.trees.plans.logical.LogicalAggregate;
-import 
org.apache.doris.nereids.trees.plans.logical.LogicalDeferMaterializeOlapScan;
-import org.apache.doris.nereids.trees.plans.logical.LogicalFilter;
-import org.apache.doris.nereids.trees.plans.logical.LogicalOlapScan;
 import org.apache.doris.nereids.trees.plans.logical.LogicalSort;
 import org.apache.doris.nereids.trees.plans.logical.LogicalTopN;
 import org.apache.doris.nereids.trees.plans.logical.LogicalWindow;
@@ -64,7 +60,6 @@ public class CheckAfterRewrite extends OneAnalysisRuleFactory 
{
             checkAllSlotReferenceFromChildren(plan);
             checkUnexpectedExpression(plan);
             checkMetricTypeIsUsedCorrectly(plan);
-            checkMatchIsUsedCorrectly(plan);
             return null;
         }).toRule(RuleType.CHECK_ANALYSIS);
     }
@@ -181,19 +176,4 @@ public class CheckAfterRewrite extends 
OneAnalysisRuleFactory {
             });
         }
     }
-
-    private void checkMatchIsUsedCorrectly(Plan plan) {
-        for (Expression expression : plan.getExpressions()) {
-            if (expression instanceof Match) {
-                if (plan instanceof LogicalFilter && (plan.child(0) instanceof 
LogicalOlapScan
-                        || plan.child(0) instanceof 
LogicalDeferMaterializeOlapScan)) {
-                    return;
-                } else {
-                    throw new AnalysisException(String.format(
-                            "Not support match in %s in plan: %s, only support 
in olapScan filter",
-                            plan.child(0), plan));
-                }
-            }
-        }
-    }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/FoldConstantRuleOnFE.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/FoldConstantRuleOnFE.java
index d7627d698d6..fdd3b02e6fd 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/FoldConstantRuleOnFE.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/FoldConstantRuleOnFE.java
@@ -43,6 +43,7 @@ import org.apache.doris.nereids.trees.expressions.InPredicate;
 import org.apache.doris.nereids.trees.expressions.IsNull;
 import org.apache.doris.nereids.trees.expressions.LessThan;
 import org.apache.doris.nereids.trees.expressions.LessThanEqual;
+import org.apache.doris.nereids.trees.expressions.Match;
 import org.apache.doris.nereids.trees.expressions.Not;
 import org.apache.doris.nereids.trees.expressions.NullSafeEqual;
 import org.apache.doris.nereids.trees.expressions.Or;
@@ -190,6 +191,16 @@ public class FoldConstantRuleOnFE extends 
AbstractExpressionRewriteRule
         return literal;
     }
 
+    @Override
+    public Expression visitMatch(Match match, ExpressionRewriteContext 
context) {
+        match = rewriteChildren(match, context);
+        Optional<Expression> checkedExpr = preProcess(match);
+        if (checkedExpr.isPresent()) {
+            return checkedExpr.get();
+        }
+        return super.visitMatch(match, context);
+    }
+
     @Override
     public Expression visitEncryptKeyRef(EncryptKeyRef encryptKeyRef, 
ExpressionRewriteContext context) {
         String dbName = encryptKeyRef.getDbName();
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/PartitionPruner.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/PartitionPruner.java
index b0b45077dcc..efe12f38cd7 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/PartitionPruner.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/PartitionPruner.java
@@ -130,7 +130,7 @@ public class PartitionPruner extends 
DefaultExpressionRewriter<Void> {
                 partitionPredicate, new 
ExpressionRewriteContext(cascadesContext));
         if (BooleanLiteral.TRUE.equals(partitionPredicate)) {
             return Utils.fastToImmutableList(idToPartitions.keySet());
-        } else if (Boolean.FALSE.equals(partitionPredicate) || 
partitionPredicate.isNullLiteral()) {
+        } else if (BooleanLiteral.FALSE.equals(partitionPredicate) || 
partitionPredicate.isNullLiteral()) {
             return ImmutableList.of();
         }
 
diff --git a/regression-test/data/nereids_syntax_p0/match.out 
b/regression-test/data/nereids_syntax_p0/match.out
index 3664b141e4b..efb8baa2fcc 100644
--- a/regression-test/data/nereids_syntax_p0/match.out
+++ b/regression-test/data/nereids_syntax_p0/match.out
@@ -109,3 +109,11 @@ li ba      li liuliu
 
 -- !match_phrase_7 --
 
+-- !match_join --
+li sisi        11      grade 6 li ba   li liuliu               zhang san yi    
11      grade 5 zhang yi        chen san        learn makes me happy
+san zhang      10      grade 5                         san zhang       10      
grade 5                 
+san zhang      10      grade 5                         zhang san       10      
grade 5 zhang yi        chen san        Class activists
+zhang san      10      grade 5 zhang yi        chen san        Class activists 
san zhang       10      grade 5                 
+zhang san      10      grade 5 zhang yi        chen san        Class activists 
zhang san       10      grade 5 zhang yi        chen san        Class activists
+zhang san yi   11      grade 5 zhang yi        chen san        learn makes me 
happy    zhang san yi    11      grade 5 zhang yi        chen san        learn 
makes me happy
+
diff --git a/regression-test/suites/nereids_syntax_p0/match.groovy 
b/regression-test/suites/nereids_syntax_p0/match.groovy
index edc4f864391..4505460ac27 100644
--- a/regression-test/suites/nereids_syntax_p0/match.groovy
+++ b/regression-test/suites/nereids_syntax_p0/match.groovy
@@ -15,7 +15,9 @@
 // specific language governing permissions and limitations
 // under the License.
 
-suite("test_nereids_match_select") {
+import java.util.stream.Collectors
+
+suite("match") {
     sql """
         SET enable_nereids_planner=true
     """
@@ -172,5 +174,35 @@ suite("test_nereids_match_select") {
     order_qt_match_phrase_7 """
         SELECT * FROM test_nereids_match_select WHERE name match_phrase 
'zhang' and selfComment match_phrase 'want go outside';
     """
+
+    def variables = sql "show variables"
+    def variableString = variables.stream()
+            .map { it.toString() }
+            .collect(Collectors.joining("\n"))
+    logger.info("Variables:\n${variableString}")
+
+    sql "set enable_fold_constant_by_be=false"
+
+    explain {
+        sql """
+        select *
+        from test_nereids_match_select a
+        left join
+        test_nereids_match_select b
+        on a.age = b.age
+        where b.name match_any 'zhang'
+        """
+
+        contains("INNER JOIN")
+    }
+
+    order_qt_match_join """
+        select *
+        from test_nereids_match_select a
+        left join
+        test_nereids_match_select b
+        on a.age = b.age
+        where b.name match_any 'zhang'
+    """
 }
 


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

Reply via email to