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