This is an automated email from the ASF dual-hosted git repository.
huajianlan pushed a commit to branch branch-2.1
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/branch-2.1 by this push:
new 75fe929dc4a [enhancement](nereids) Support eliminate outer join by
match expression (#38537) (#38925)
75fe929dc4a is described below
commit 75fe929dc4aaf60301f6ef1d5b44e215d1c137bc
Author: 924060929 <[email protected]>
AuthorDate: Tue Aug 6 13:16:57 2024 +0800
[enhancement](nereids) Support eliminate outer join by match expression
(#38537) (#38925)
enable run match expression outer of filter plan, e.g join conjunct
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 31ed154da3d..8c1b5538205 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: [email protected]
For additional commands, e-mail: [email protected]