This is an automated email from the ASF dual-hosted git repository.
englefly pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/master by this push:
new 25cd9559652 [feat](nereids) add session variable
disable_nereids_expression_rules (#44831)
25cd9559652 is described below
commit 25cd9559652d0a9715db138687d1264ccf4045e9
Author: yujun <[email protected]>
AuthorDate: Tue Dec 31 16:21:39 2024 +0800
[feat](nereids) add session variable disable_nereids_expression_rules
(#44831)
### What problem does this PR solve?
Issue Number: close #xxx
Related PR: #xxx
Problem Summary:
Add session variable test_disable_nereids_expression_rule for disable
expression rule, example:
```sql
SET disable_nereids_expression_rules='SIMPLIFY_COMPARISON_PREDICATE'
```
for a expression rule `ExpressionPatternMatcher`, its has default rule
type: ANONYMOUS.
when it calls `toRule(ruleTypeXX)` will create a rule with type:
ruleTypeXX.
---
.../nereids/pattern/ExpressionPatternRules.java | 12 +++--
.../expression/ExpressionPatternMatchRule.java | 6 +++
.../rules/expression/ExpressionPatternMatcher.java | 5 +-
.../expression/ExpressionPatternRuleFactory.java | 21 +++++---
.../rules/expression/ExpressionRuleType.java | 59 ++++++++++++++++++++++
.../nereids/rules/expression/check/CheckCast.java | 3 +-
.../nereids/rules/expression/rules/AddMinMax.java | 2 +
.../rules/ArrayContainToArrayOverlap.java | 2 +
.../rules/expression/rules/BetweenToEqual.java | 2 +
.../rules/expression/rules/CaseWhenToIf.java | 2 +
.../expression/rules/ConvertAggStateCast.java | 2 +
.../expression/rules/DateFunctionRewrite.java | 14 +++--
.../expression/rules/DigitalMaskingConvert.java | 5 +-
.../expression/rules/DistinctPredicatesRule.java | 2 +
.../expression/rules/ExtractCommonFactorRule.java | 2 +
.../expression/rules/FoldConstantRuleOnBE.java | 2 +
.../expression/rules/FoldConstantRuleOnFE.java | 4 +-
.../rules/expression/rules/InPredicateDedup.java | 2 +
.../expression/rules/InPredicateToEqualToRule.java | 5 +-
.../rules/expression/rules/LikeToEqualRewrite.java | 2 +
.../rules/expression/rules/MergeDateTrunc.java | 2 +
.../rules/NormalizeBinaryPredicatesRule.java | 2 +
.../expression/rules/NullSafeEqualToEqual.java | 2 +
.../nereids/rules/expression/rules/OrToIn.java | 2 +
.../expression/rules/ReplaceVariableByLiteral.java | 3 +-
.../rules/SimplifyArithmeticComparisonRule.java | 2 +
.../expression/rules/SimplifyArithmeticRule.java | 2 +
.../rules/expression/rules/SimplifyCastRule.java | 2 +
.../rules/SimplifyComparisonPredicate.java | 2 +
.../rules/SimplifyConditionalFunction.java | 8 ++-
.../expression/rules/SimplifyInPredicate.java | 2 +
.../expression/rules/SimplifyNotExprRule.java | 2 +
.../rules/expression/rules/SimplifyRange.java | 2 +
.../expression/rules/SupportJavaDateFormatter.java | 8 ++-
.../nereids/rules/expression/rules/TopnToMax.java | 2 +
.../nereids/rules/rewrite/ExprIdRewriter.java | 3 +-
.../java/org/apache/doris/qe/SessionVariable.java | 26 ++++++++++
.../test_disable_nereids_expression_rule.out | 10 ++++
.../test_disable_nereids_expression_rule.groovy | 28 ++++++++++
39 files changed, 237 insertions(+), 27 deletions(-)
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/pattern/ExpressionPatternRules.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/pattern/ExpressionPatternRules.java
index 523540e6435..339c082dbd2 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/pattern/ExpressionPatternRules.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/pattern/ExpressionPatternRules.java
@@ -26,6 +26,7 @@ import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import java.lang.reflect.Field;
+import java.util.BitSet;
import java.util.List;
import java.util.Optional;
import java.util.Set;
@@ -48,10 +49,13 @@ public class ExpressionPatternRules extends
TypeMappings<Expression, ExpressionP
List<ExpressionPatternMatchRule> rules =
singleMappings.get(expr.getClass());
ExpressionMatchingContext<Expression> matchingContext
= new ExpressionMatchingContext<>(expr, parent, context);
+ BitSet disableRules =
context.cascadesContext.getConnectContext().getSessionVariable()
+ .getDisableNereidsExpressionRules();
switch (rules.size()) {
case 0: {
for (ExpressionPatternMatchRule multiMatchRule :
multiMappings) {
- if
(multiMatchRule.matchesTypeAndPredicates(matchingContext)) {
+ if
(!disableRules.get(multiMatchRule.getExpressionRuleType().type())
+ &&
multiMatchRule.matchesTypeAndPredicates(matchingContext)) {
Expression newExpr =
multiMatchRule.apply(matchingContext);
if (!newExpr.equals(expr)) {
if (context.cascadesContext.isEnableExprTrace()) {
@@ -65,7 +69,8 @@ public class ExpressionPatternRules extends
TypeMappings<Expression, ExpressionP
}
case 1: {
ExpressionPatternMatchRule rule = rules.get(0);
- if (rule.matchesPredicates(matchingContext)) {
+ if (!disableRules.get(rule.getExpressionRuleType().type())
+ && rule.matchesPredicates(matchingContext)) {
Expression newExpr = rule.apply(matchingContext);
if (!newExpr.equals(expr)) {
if (context.cascadesContext.isEnableExprTrace()) {
@@ -78,7 +83,8 @@ public class ExpressionPatternRules extends
TypeMappings<Expression, ExpressionP
}
default: {
for (ExpressionPatternMatchRule rule : rules) {
- if (rule.matchesPredicates(matchingContext)) {
+ if (!disableRules.get(rule.getExpressionRuleType().type())
+ && rule.matchesPredicates(matchingContext)) {
Expression newExpr = rule.apply(matchingContext);
if (!expr.equals(newExpr)) {
if (context.cascadesContext.isEnableExprTrace()) {
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/ExpressionPatternMatchRule.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/ExpressionPatternMatchRule.java
index dbf5c79c96d..b794981f657 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/ExpressionPatternMatchRule.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/ExpressionPatternMatchRule.java
@@ -25,11 +25,13 @@ import java.util.function.Predicate;
/** ExpressionPatternMatcherRule */
public class ExpressionPatternMatchRule implements TypeMapping<Expression> {
+ public final ExpressionRuleType expressionRuleType;
public final Class<? extends Expression> typePattern;
public final List<Predicate<ExpressionMatchingContext<Expression>>>
predicates;
public final ExpressionMatchingAction<Expression> matchingAction;
public ExpressionPatternMatchRule(ExpressionPatternMatcher patternMatcher)
{
+ this.expressionRuleType = patternMatcher.expressionRuleType;
this.typePattern = patternMatcher.typePattern;
this.predicates = patternMatcher.predicates;
this.matchingAction = patternMatcher.matchingAction;
@@ -61,4 +63,8 @@ public class ExpressionPatternMatchRule implements
TypeMapping<Expression> {
public Class<? extends Expression> getType() {
return typePattern;
}
+
+ public ExpressionRuleType getExpressionRuleType() {
+ return expressionRuleType;
+ }
}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/ExpressionPatternMatcher.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/ExpressionPatternMatcher.java
index 058b1d60b1d..0815060724e 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/ExpressionPatternMatcher.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/ExpressionPatternMatcher.java
@@ -27,13 +27,16 @@ import java.util.function.Predicate;
/** ExpressionPattern */
public class ExpressionPatternMatcher<E extends Expression> {
+
+ public final ExpressionRuleType expressionRuleType;
public final Class<E> typePattern;
public final List<Predicate<ExpressionMatchingContext<E>>> predicates;
public final ExpressionMatchingAction<E> matchingAction;
- public ExpressionPatternMatcher(Class<E> typePattern,
+ public ExpressionPatternMatcher(ExpressionRuleType expressionRuleType,
Class<E> typePattern,
List<Predicate<ExpressionMatchingContext<E>>> predicates,
ExpressionMatchingAction<E> matchingAction) {
+ this.expressionRuleType = Objects.requireNonNull(expressionRuleType,
"expressionRuleType can not be null");
this.typePattern = Objects.requireNonNull(typePattern, "typePattern
can not be null");
this.predicates = predicates == null ? ImmutableList.of() : predicates;
this.matchingAction = Objects.requireNonNull(matchingAction,
"matchingAction can not be null");
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/ExpressionPatternRuleFactory.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/ExpressionPatternRuleFactory.java
index 7fb18735ba5..635f8e0db7d 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/ExpressionPatternRuleFactory.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/ExpressionPatternRuleFactory.java
@@ -48,15 +48,18 @@ public interface ExpressionPatternRuleFactory {
class ExpressionPatternDescriptor<E extends Expression> {
private final Class<E> typePattern;
private final ImmutableList<Predicate<ExpressionMatchingContext<E>>>
predicates;
+ private final ExpressionMatchingAction<E> matchingAction;
public ExpressionPatternDescriptor(Class<E> typePattern) {
- this(typePattern, ImmutableList.of());
+ this(typePattern, ImmutableList.of(), ctx -> ctx.expr);
}
public ExpressionPatternDescriptor(
- Class<E> typePattern,
ImmutableList<Predicate<ExpressionMatchingContext<E>>> predicates) {
+ Class<E> typePattern,
ImmutableList<Predicate<ExpressionMatchingContext<E>>> predicates,
+ ExpressionMatchingAction<E> matchingAction) {
this.typePattern = Objects.requireNonNull(typePattern,
"typePattern can not be null");
this.predicates = Objects.requireNonNull(predicates, "predicates
can not be null");
+ this.matchingAction = Objects.requireNonNull(matchingAction,
"action can not be null");
}
public ExpressionPatternDescriptor<E> when(Predicate<E> predicate) {
@@ -68,17 +71,21 @@ public interface ExpressionPatternRuleFactory {
= ImmutableList.builderWithExpectedSize(predicates.size()
+ 1);
newPredicates.addAll(predicates);
newPredicates.add(predicate);
- return new ExpressionPatternDescriptor<>(typePattern,
newPredicates.build());
+ return new ExpressionPatternDescriptor<>(typePattern,
newPredicates.build(), ctx -> ctx.expr);
}
/** then */
- public ExpressionPatternMatcher<E> then(Function<E, Expression>
rewriter) {
- return new ExpressionPatternMatcher<>(
+ public ExpressionPatternDescriptor<E> then(Function<E, Expression>
rewriter) {
+ return new ExpressionPatternDescriptor<>(
typePattern, predicates, (context) ->
rewriter.apply(context.expr));
}
- public ExpressionPatternMatcher<E>
thenApply(ExpressionMatchingAction<E> action) {
- return new ExpressionPatternMatcher<>(typePattern, predicates,
action);
+ public ExpressionPatternDescriptor<E>
thenApply(ExpressionMatchingAction<E> action) {
+ return new ExpressionPatternDescriptor<>(typePattern, predicates,
action);
+ }
+
+ public ExpressionPatternMatcher<E> toRule(ExpressionRuleType
expressionRuleType) {
+ return new ExpressionPatternMatcher<>(expressionRuleType,
typePattern, predicates, matchingAction);
}
}
}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/ExpressionRuleType.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/ExpressionRuleType.java
new file mode 100644
index 00000000000..d8919d1eaed
--- /dev/null
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/ExpressionRuleType.java
@@ -0,0 +1,59 @@
+// 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.
+
+package org.apache.doris.nereids.rules.expression;
+
+/**
+ * Type of rewrite expression rules.
+ */
+public enum ExpressionRuleType {
+ ADD_MIN_MAX,
+ ARRAY_CONTAIN_TO_ARRAY_OVERLAP,
+ BETWEEN_TO_EQUAL,
+ CASE_WHEN_TO_IF,
+ CHECK_CAST,
+ CONVERT_AGG_STATE_CAST,
+ DATE_FUNCTION_REWRITE,
+ DIGITAL_MASKING_CONVERT,
+ DISTINCT_PREDICATES,
+ EXPR_ID_REWRITE_REPLACE,
+ EXTRACT_COMMON_FACTOR,
+ FOLD_CONSTANT_ON_BE,
+ FOLD_CONSTANT_ON_FE,
+ IN_PREDICATE_DEDUP,
+ IN_PREDICATE_TO_EQUAL_TO,
+ LIKE_TO_EQUAL,
+ MERGE_DATE_TRUNC,
+ NORMALIZE_BINARY_PREDICATES,
+ NULL_SAFE_EQUAL_TO_EQUAL,
+ OR_TO_IN,
+ REPLACE_VARIABLE_BY_LITERAL,
+ SIMPLIFY_ARITHMETIC_COMPARISON,
+ SIMPLIFY_ARITHMETIC,
+ SIMPLIFY_CAST,
+ SIMPLIFY_COMPARISON_PREDICATE,
+ SIMPLIFY_CONDITIONAL_FUNCTION,
+ SIMPLIFY_IN_PREDICATE,
+ SIMPLIFY_NOT_EXPR,
+ SIMPLIFY_RANGE,
+ SUPPORT_JAVA_DATE_FORMATTER,
+ TOPN_TO_MAX;
+
+ public int type() {
+ return ordinal();
+ }
+}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/check/CheckCast.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/check/CheckCast.java
index e76d7ef344d..e3ede36da19 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/check/CheckCast.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/check/CheckCast.java
@@ -20,6 +20,7 @@ package org.apache.doris.nereids.rules.expression.check;
import org.apache.doris.nereids.exceptions.AnalysisException;
import org.apache.doris.nereids.rules.expression.ExpressionPatternMatcher;
import org.apache.doris.nereids.rules.expression.ExpressionPatternRuleFactory;
+import org.apache.doris.nereids.rules.expression.ExpressionRuleType;
import org.apache.doris.nereids.trees.expressions.Cast;
import org.apache.doris.nereids.trees.expressions.Expression;
import org.apache.doris.nereids.types.ArrayType;
@@ -44,7 +45,7 @@ public class CheckCast implements
ExpressionPatternRuleFactory {
@Override
public List<ExpressionPatternMatcher<? extends Expression>> buildRules() {
return ImmutableList.of(
- matchesType(Cast.class).then(CheckCast::check)
+
matchesType(Cast.class).then(CheckCast::check).toRule(ExpressionRuleType.CHECK_CAST)
);
}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/AddMinMax.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/AddMinMax.java
index c1efb82bac6..80d245c3780 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/AddMinMax.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/AddMinMax.java
@@ -20,6 +20,7 @@ package org.apache.doris.nereids.rules.expression.rules;
import org.apache.doris.nereids.rules.expression.ExpressionPatternMatcher;
import org.apache.doris.nereids.rules.expression.ExpressionPatternRuleFactory;
import org.apache.doris.nereids.rules.expression.ExpressionRewriteContext;
+import org.apache.doris.nereids.rules.expression.ExpressionRuleType;
import
org.apache.doris.nereids.rules.expression.rules.RangeInference.DiscreteValue;
import
org.apache.doris.nereids.rules.expression.rules.RangeInference.EmptyValue;
import
org.apache.doris.nereids.rules.expression.rules.RangeInference.RangeValue;
@@ -69,6 +70,7 @@ public class AddMinMax implements
ExpressionPatternRuleFactory {
return ImmutableList.of(
matchesTopType(CompoundPredicate.class)
.thenApply(ctx -> rewrite(ctx.expr,
ctx.rewriteContext))
+ .toRule(ExpressionRuleType.ADD_MIN_MAX)
);
}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/ArrayContainToArrayOverlap.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/ArrayContainToArrayOverlap.java
index f32d76062aa..93e7873638d 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/ArrayContainToArrayOverlap.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/ArrayContainToArrayOverlap.java
@@ -19,6 +19,7 @@ package org.apache.doris.nereids.rules.expression.rules;
import org.apache.doris.nereids.rules.expression.ExpressionPatternMatcher;
import org.apache.doris.nereids.rules.expression.ExpressionPatternRuleFactory;
+import org.apache.doris.nereids.rules.expression.ExpressionRuleType;
import org.apache.doris.nereids.trees.expressions.Expression;
import org.apache.doris.nereids.trees.expressions.Or;
import
org.apache.doris.nereids.trees.expressions.functions.scalar.ArrayContains;
@@ -57,6 +58,7 @@ public class ArrayContainToArrayOverlap implements
ExpressionPatternRuleFactory
public List<ExpressionPatternMatcher<? extends Expression>> buildRules() {
return ImmutableList.of(
matchesTopType(Or.class).then(ArrayContainToArrayOverlap::rewrite)
+
.toRule(ExpressionRuleType.ARRAY_CONTAIN_TO_ARRAY_OVERLAP)
);
}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/BetweenToEqual.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/BetweenToEqual.java
index d1279fdfda5..9d9eda0a3fd 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/BetweenToEqual.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/BetweenToEqual.java
@@ -19,6 +19,7 @@ package org.apache.doris.nereids.rules.expression.rules;
import org.apache.doris.nereids.rules.expression.ExpressionPatternMatcher;
import org.apache.doris.nereids.rules.expression.ExpressionPatternRuleFactory;
+import org.apache.doris.nereids.rules.expression.ExpressionRuleType;
import org.apache.doris.nereids.trees.expressions.And;
import org.apache.doris.nereids.trees.expressions.ComparisonPredicate;
import org.apache.doris.nereids.trees.expressions.EqualTo;
@@ -47,6 +48,7 @@ public class BetweenToEqual implements
ExpressionPatternRuleFactory {
public List<ExpressionPatternMatcher<? extends Expression>> buildRules() {
return ImmutableList.of(
matchesType(And.class).then(BetweenToEqual::rewriteBetweenToEqual)
+ .toRule(ExpressionRuleType.BETWEEN_TO_EQUAL)
);
}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/CaseWhenToIf.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/CaseWhenToIf.java
index cafb0ecd068..17d6c6fa675 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/CaseWhenToIf.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/CaseWhenToIf.java
@@ -19,6 +19,7 @@ package org.apache.doris.nereids.rules.expression.rules;
import org.apache.doris.nereids.rules.expression.ExpressionPatternMatcher;
import org.apache.doris.nereids.rules.expression.ExpressionPatternRuleFactory;
+import org.apache.doris.nereids.rules.expression.ExpressionRuleType;
import org.apache.doris.nereids.trees.expressions.CaseWhen;
import org.apache.doris.nereids.trees.expressions.Expression;
import org.apache.doris.nereids.trees.expressions.WhenClause;
@@ -42,6 +43,7 @@ public class CaseWhenToIf implements
ExpressionPatternRuleFactory {
public List<ExpressionPatternMatcher<? extends Expression>> buildRules() {
return ImmutableList.of(
matchesTopType(CaseWhen.class).then(CaseWhenToIf::rewrite)
+ .toRule(ExpressionRuleType.CASE_WHEN_TO_IF)
);
}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/ConvertAggStateCast.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/ConvertAggStateCast.java
index 6d5a70139ab..28f6cc51365 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/ConvertAggStateCast.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/ConvertAggStateCast.java
@@ -19,6 +19,7 @@ package org.apache.doris.nereids.rules.expression.rules;
import org.apache.doris.nereids.rules.expression.ExpressionPatternMatcher;
import org.apache.doris.nereids.rules.expression.ExpressionPatternRuleFactory;
+import org.apache.doris.nereids.rules.expression.ExpressionRuleType;
import org.apache.doris.nereids.trees.expressions.Alias;
import org.apache.doris.nereids.trees.expressions.Cast;
import org.apache.doris.nereids.trees.expressions.Expression;
@@ -44,6 +45,7 @@ public class ConvertAggStateCast implements
ExpressionPatternRuleFactory {
public List<ExpressionPatternMatcher<? extends Expression>> buildRules() {
return ImmutableList.of(
matchesType(Cast.class).then(ConvertAggStateCast::convert)
+ .toRule(ExpressionRuleType.CONVERT_AGG_STATE_CAST)
);
}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/DateFunctionRewrite.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/DateFunctionRewrite.java
index 07ec0c3de71..deba786d44c 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/DateFunctionRewrite.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/DateFunctionRewrite.java
@@ -19,6 +19,7 @@ package org.apache.doris.nereids.rules.expression.rules;
import org.apache.doris.nereids.rules.expression.ExpressionPatternMatcher;
import org.apache.doris.nereids.rules.expression.ExpressionPatternRuleFactory;
+import org.apache.doris.nereids.rules.expression.ExpressionRuleType;
import org.apache.doris.nereids.trees.expressions.And;
import org.apache.doris.nereids.trees.expressions.EqualTo;
import org.apache.doris.nereids.trees.expressions.Expression;
@@ -50,11 +51,16 @@ public class DateFunctionRewrite implements
ExpressionPatternRuleFactory {
@Override
public List<ExpressionPatternMatcher<? extends Expression>> buildRules() {
return ImmutableList.of(
-
matchesType(EqualTo.class).then(DateFunctionRewrite::rewriteEqualTo),
-
matchesType(GreaterThan.class).then(DateFunctionRewrite::rewriteGreaterThan),
-
matchesType(GreaterThanEqual.class).then(DateFunctionRewrite::rewriteGreaterThanEqual),
-
matchesType(LessThan.class).then(DateFunctionRewrite::rewriteLessThan),
+
matchesType(EqualTo.class).then(DateFunctionRewrite::rewriteEqualTo)
+ .toRule(ExpressionRuleType.DATE_FUNCTION_REWRITE),
+
matchesType(GreaterThan.class).then(DateFunctionRewrite::rewriteGreaterThan)
+ .toRule(ExpressionRuleType.DATE_FUNCTION_REWRITE),
+
matchesType(GreaterThanEqual.class).then(DateFunctionRewrite::rewriteGreaterThanEqual)
+ .toRule(ExpressionRuleType.DATE_FUNCTION_REWRITE),
+
matchesType(LessThan.class).then(DateFunctionRewrite::rewriteLessThan)
+ .toRule(ExpressionRuleType.DATE_FUNCTION_REWRITE),
matchesType(LessThanEqual.class).then(DateFunctionRewrite::rewriteLessThanEqual)
+ .toRule(ExpressionRuleType.DATE_FUNCTION_REWRITE)
);
}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/DigitalMaskingConvert.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/DigitalMaskingConvert.java
index 95d25e3c592..d9cfee2b407 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/DigitalMaskingConvert.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/DigitalMaskingConvert.java
@@ -19,6 +19,7 @@ package org.apache.doris.nereids.rules.expression.rules;
import org.apache.doris.nereids.rules.expression.ExpressionPatternMatcher;
import org.apache.doris.nereids.rules.expression.ExpressionPatternRuleFactory;
+import org.apache.doris.nereids.rules.expression.ExpressionRuleType;
import org.apache.doris.nereids.trees.expressions.Expression;
import org.apache.doris.nereids.trees.expressions.functions.scalar.Concat;
import
org.apache.doris.nereids.trees.expressions.functions.scalar.DigitalMasking;
@@ -43,8 +44,8 @@ public class DigitalMaskingConvert implements
ExpressionPatternRuleFactory {
new Concat(
new Left(digitalMasking.child(), Literal.of(3)),
Literal.of("****"),
- new Right(digitalMasking.child(), Literal.of(4)))
- )
+ new Right(digitalMasking.child(), Literal.of(4))))
+ .toRule(ExpressionRuleType.DIGITAL_MASKING_CONVERT)
);
}
}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/DistinctPredicatesRule.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/DistinctPredicatesRule.java
index cf18886cd85..83d7be34fac 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/DistinctPredicatesRule.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/DistinctPredicatesRule.java
@@ -19,6 +19,7 @@ package org.apache.doris.nereids.rules.expression.rules;
import org.apache.doris.nereids.rules.expression.ExpressionPatternMatcher;
import org.apache.doris.nereids.rules.expression.ExpressionPatternRuleFactory;
+import org.apache.doris.nereids.rules.expression.ExpressionRuleType;
import org.apache.doris.nereids.trees.expressions.CompoundPredicate;
import org.apache.doris.nereids.trees.expressions.Expression;
import org.apache.doris.nereids.util.ExpressionUtils;
@@ -43,6 +44,7 @@ public class DistinctPredicatesRule implements
ExpressionPatternRuleFactory {
public List<ExpressionPatternMatcher<? extends Expression>> buildRules() {
return ImmutableList.of(
matchesTopType(CompoundPredicate.class).then(DistinctPredicatesRule::distinct)
+ .toRule(ExpressionRuleType.DISTINCT_PREDICATES)
);
}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/ExtractCommonFactorRule.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/ExtractCommonFactorRule.java
index d79fafa80a7..9ad42d1b379 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/ExtractCommonFactorRule.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/ExtractCommonFactorRule.java
@@ -20,6 +20,7 @@ package org.apache.doris.nereids.rules.expression.rules;
import org.apache.doris.nereids.annotation.Developing;
import org.apache.doris.nereids.rules.expression.ExpressionPatternMatcher;
import org.apache.doris.nereids.rules.expression.ExpressionPatternRuleFactory;
+import org.apache.doris.nereids.rules.expression.ExpressionRuleType;
import org.apache.doris.nereids.trees.expressions.CompoundPredicate;
import org.apache.doris.nereids.trees.expressions.Expression;
import org.apache.doris.nereids.trees.expressions.literal.BooleanLiteral;
@@ -56,6 +57,7 @@ public class ExtractCommonFactorRule implements
ExpressionPatternRuleFactory {
public List<ExpressionPatternMatcher<? extends Expression>> buildRules() {
return ImmutableList.of(
matchesTopType(CompoundPredicate.class).then(ExtractCommonFactorRule::extractCommonFactor)
+ .toRule(ExpressionRuleType.EXTRACT_COMMON_FACTOR)
);
}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/FoldConstantRuleOnBE.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/FoldConstantRuleOnBE.java
index dd79de70e26..21a0d1d59c8 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/FoldConstantRuleOnBE.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/FoldConstantRuleOnBE.java
@@ -31,6 +31,7 @@ import
org.apache.doris.nereids.glue.translator.ExpressionTranslator;
import org.apache.doris.nereids.rules.expression.ExpressionMatchingContext;
import org.apache.doris.nereids.rules.expression.ExpressionPatternMatcher;
import org.apache.doris.nereids.rules.expression.ExpressionPatternRuleFactory;
+import org.apache.doris.nereids.rules.expression.ExpressionRuleType;
import org.apache.doris.nereids.trees.expressions.Alias;
import org.apache.doris.nereids.trees.expressions.ArrayItemReference;
import org.apache.doris.nereids.trees.expressions.Cast;
@@ -123,6 +124,7 @@ public class FoldConstantRuleOnBE implements
ExpressionPatternRuleFactory {
.isDebugSkipFoldConstant())
.whenCtx(FoldConstantRuleOnBE::isEnableFoldByBe)
.thenApply(FoldConstantRuleOnBE::foldByBE)
+ .toRule(ExpressionRuleType.FOLD_CONSTANT_ON_BE)
);
}
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 c2a73f7afec..c4dd18acaa2 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
@@ -33,6 +33,7 @@ import
org.apache.doris.nereids.rules.expression.ExpressionMatchingContext;
import org.apache.doris.nereids.rules.expression.ExpressionPatternMatcher;
import org.apache.doris.nereids.rules.expression.ExpressionPatternRuleFactory;
import org.apache.doris.nereids.rules.expression.ExpressionRewriteContext;
+import org.apache.doris.nereids.rules.expression.ExpressionRuleType;
import org.apache.doris.nereids.rules.expression.ExpressionTraverseListener;
import
org.apache.doris.nereids.rules.expression.ExpressionTraverseListenerFactory;
import org.apache.doris.nereids.trees.expressions.AggregateExpression;
@@ -764,6 +765,7 @@ public class FoldConstantRuleOnFE extends
AbstractExpressionRewriteRule
.whenCtx(ctx ->
!ctx.cascadesContext.getConnectContext().getSessionVariable()
.isDebugSkipFoldConstant())
.whenCtx(NOT_UNDER_AGG_DISTINCT.as())
- .thenApply(ctx -> visitMethod.apply(ctx.expr,
ctx.rewriteContext));
+ .thenApply(ctx -> visitMethod.apply(ctx.expr,
ctx.rewriteContext))
+ .toRule(ExpressionRuleType.FOLD_CONSTANT_ON_FE);
}
}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/InPredicateDedup.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/InPredicateDedup.java
index 3760dcf0e72..aaa822ac691 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/InPredicateDedup.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/InPredicateDedup.java
@@ -19,6 +19,7 @@ package org.apache.doris.nereids.rules.expression.rules;
import org.apache.doris.nereids.rules.expression.ExpressionPatternMatcher;
import org.apache.doris.nereids.rules.expression.ExpressionPatternRuleFactory;
+import org.apache.doris.nereids.rules.expression.ExpressionRuleType;
import org.apache.doris.nereids.trees.expressions.Expression;
import org.apache.doris.nereids.trees.expressions.InPredicate;
@@ -39,6 +40,7 @@ public class InPredicateDedup implements
ExpressionPatternRuleFactory {
public List<ExpressionPatternMatcher<? extends Expression>> buildRules() {
return ImmutableList.of(
matchesType(InPredicate.class).then(InPredicateDedup::dedup)
+ .toRule(ExpressionRuleType.IN_PREDICATE_DEDUP)
);
}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/InPredicateToEqualToRule.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/InPredicateToEqualToRule.java
index 353de7f41f6..463393327a1 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/InPredicateToEqualToRule.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/InPredicateToEqualToRule.java
@@ -19,6 +19,7 @@ package org.apache.doris.nereids.rules.expression.rules;
import org.apache.doris.nereids.rules.expression.ExpressionPatternMatcher;
import org.apache.doris.nereids.rules.expression.ExpressionPatternRuleFactory;
+import org.apache.doris.nereids.rules.expression.ExpressionRuleType;
import org.apache.doris.nereids.trees.expressions.EqualTo;
import org.apache.doris.nereids.trees.expressions.Expression;
import org.apache.doris.nereids.trees.expressions.InPredicate;
@@ -46,8 +47,8 @@ public class InPredicateToEqualToRule implements
ExpressionPatternRuleFactory {
return ImmutableList.of(
matchesType(InPredicate.class)
.when(in -> in.getOptions().size() == 1)
- .then(in -> new EqualTo(in.getCompareExpr(),
in.getOptions().get(0))
- )
+ .then(in -> new EqualTo(in.getCompareExpr(),
in.getOptions().get(0)))
+ .toRule(ExpressionRuleType.IN_PREDICATE_TO_EQUAL_TO)
);
}
}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/LikeToEqualRewrite.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/LikeToEqualRewrite.java
index e2836204cdc..0e93b7ddc5a 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/LikeToEqualRewrite.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/LikeToEqualRewrite.java
@@ -19,6 +19,7 @@ package org.apache.doris.nereids.rules.expression.rules;
import org.apache.doris.nereids.rules.expression.ExpressionPatternMatcher;
import org.apache.doris.nereids.rules.expression.ExpressionPatternRuleFactory;
+import org.apache.doris.nereids.rules.expression.ExpressionRuleType;
import org.apache.doris.nereids.trees.expressions.EqualTo;
import org.apache.doris.nereids.trees.expressions.Expression;
import org.apache.doris.nereids.trees.expressions.Like;
@@ -38,6 +39,7 @@ public class LikeToEqualRewrite implements
ExpressionPatternRuleFactory {
public List<ExpressionPatternMatcher<? extends Expression>> buildRules() {
return ImmutableList.of(
matchesType(Like.class).then(LikeToEqualRewrite::rewriteLikeToEqual)
+ .toRule(ExpressionRuleType.LIKE_TO_EQUAL)
);
}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/MergeDateTrunc.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/MergeDateTrunc.java
index 892724cf893..f52ba41948d 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/MergeDateTrunc.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/MergeDateTrunc.java
@@ -19,6 +19,7 @@ package org.apache.doris.nereids.rules.expression.rules;
import org.apache.doris.nereids.rules.expression.ExpressionPatternMatcher;
import org.apache.doris.nereids.rules.expression.ExpressionPatternRuleFactory;
+import org.apache.doris.nereids.rules.expression.ExpressionRuleType;
import org.apache.doris.nereids.trees.expressions.Expression;
import org.apache.doris.nereids.trees.expressions.functions.scalar.DateTrunc;
import org.apache.doris.nereids.trees.expressions.literal.Interval.TimeUnit;
@@ -47,6 +48,7 @@ public class MergeDateTrunc implements
ExpressionPatternRuleFactory {
matchesTopType(DateTrunc.class)
.when(dateTrunc -> dateTrunc.getArgument(0) instanceof
DateTrunc)
.then(MergeDateTrunc::rewrite)
+ .toRule(ExpressionRuleType.MERGE_DATE_TRUNC)
);
}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/NormalizeBinaryPredicatesRule.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/NormalizeBinaryPredicatesRule.java
index e73104793cd..433a43ba185 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/NormalizeBinaryPredicatesRule.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/NormalizeBinaryPredicatesRule.java
@@ -19,6 +19,7 @@ package org.apache.doris.nereids.rules.expression.rules;
import org.apache.doris.nereids.rules.expression.ExpressionPatternMatcher;
import org.apache.doris.nereids.rules.expression.ExpressionPatternRuleFactory;
+import org.apache.doris.nereids.rules.expression.ExpressionRuleType;
import org.apache.doris.nereids.trees.expressions.ComparisonPredicate;
import org.apache.doris.nereids.trees.expressions.Expression;
@@ -38,6 +39,7 @@ public class NormalizeBinaryPredicatesRule implements
ExpressionPatternRuleFacto
public List<ExpressionPatternMatcher<? extends Expression>> buildRules() {
return ImmutableList.of(
matchesType(ComparisonPredicate.class).then(NormalizeBinaryPredicatesRule::normalize)
+ .toRule(ExpressionRuleType.NORMALIZE_BINARY_PREDICATES)
);
}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/NullSafeEqualToEqual.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/NullSafeEqualToEqual.java
index 16c4663a1ed..6b3b53feb6b 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/NullSafeEqualToEqual.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/NullSafeEqualToEqual.java
@@ -19,6 +19,7 @@ package org.apache.doris.nereids.rules.expression.rules;
import org.apache.doris.nereids.rules.expression.ExpressionPatternMatcher;
import org.apache.doris.nereids.rules.expression.ExpressionPatternRuleFactory;
+import org.apache.doris.nereids.rules.expression.ExpressionRuleType;
import org.apache.doris.nereids.trees.expressions.EqualTo;
import org.apache.doris.nereids.trees.expressions.Expression;
import org.apache.doris.nereids.trees.expressions.IsNull;
@@ -42,6 +43,7 @@ public class NullSafeEqualToEqual implements
ExpressionPatternRuleFactory {
public List<ExpressionPatternMatcher<? extends Expression>> buildRules() {
return ImmutableList.of(
matchesType(NullSafeEqual.class).then(NullSafeEqualToEqual::rewrite)
+ .toRule(ExpressionRuleType.NULL_SAFE_EQUAL_TO_EQUAL)
);
}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/OrToIn.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/OrToIn.java
index af61bbdaddf..59b340478ce 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/OrToIn.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/OrToIn.java
@@ -23,6 +23,7 @@ import
org.apache.doris.nereids.rules.expression.ExpressionPatternMatcher;
import org.apache.doris.nereids.rules.expression.ExpressionPatternRuleFactory;
import org.apache.doris.nereids.rules.expression.ExpressionRewrite;
import org.apache.doris.nereids.rules.expression.ExpressionRewriteContext;
+import org.apache.doris.nereids.rules.expression.ExpressionRuleType;
import org.apache.doris.nereids.trees.expressions.And;
import org.apache.doris.nereids.trees.expressions.CompoundPredicate;
import org.apache.doris.nereids.trees.expressions.EqualTo;
@@ -59,6 +60,7 @@ public class OrToIn implements ExpressionPatternRuleFactory {
public List<ExpressionPatternMatcher<? extends Expression>> buildRules() {
return ImmutableList.of(
matchesTopType(Or.class).then(OrToIn.INSTANCE::rewrite)
+ .toRule(ExpressionRuleType.OR_TO_IN)
);
}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/ReplaceVariableByLiteral.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/ReplaceVariableByLiteral.java
index 74f41e17cac..e800bf790c5 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/ReplaceVariableByLiteral.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/ReplaceVariableByLiteral.java
@@ -21,6 +21,7 @@ import org.apache.doris.nereids.SqlCacheContext;
import org.apache.doris.nereids.StatementContext;
import org.apache.doris.nereids.rules.expression.ExpressionPatternMatcher;
import org.apache.doris.nereids.rules.expression.ExpressionPatternRuleFactory;
+import org.apache.doris.nereids.rules.expression.ExpressionRuleType;
import org.apache.doris.nereids.trees.expressions.Expression;
import org.apache.doris.nereids.trees.expressions.Variable;
@@ -46,7 +47,7 @@ public class ReplaceVariableByLiteral implements
ExpressionPatternRuleFactory {
sqlCacheContext.get().addUsedVariable(variable);
}
return variable.getRealExpression();
- })
+ }).toRule(ExpressionRuleType.REPLACE_VARIABLE_BY_LITERAL)
);
}
}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyArithmeticComparisonRule.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyArithmeticComparisonRule.java
index 863bfd18f45..853b5a3dfc9 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyArithmeticComparisonRule.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyArithmeticComparisonRule.java
@@ -20,6 +20,7 @@ package org.apache.doris.nereids.rules.expression.rules;
import org.apache.doris.nereids.rules.expression.ExpressionPatternMatcher;
import org.apache.doris.nereids.rules.expression.ExpressionPatternRuleFactory;
import org.apache.doris.nereids.rules.expression.ExpressionRewriteContext;
+import org.apache.doris.nereids.rules.expression.ExpressionRuleType;
import org.apache.doris.nereids.trees.expressions.Add;
import org.apache.doris.nereids.trees.expressions.ComparisonPredicate;
import org.apache.doris.nereids.trees.expressions.Divide;
@@ -82,6 +83,7 @@ public class SimplifyArithmeticComparisonRule implements
ExpressionPatternRuleFa
return ImmutableList.of(
matchesType(ComparisonPredicate.class)
.thenApply(ctx -> simplify(ctx.expr, new
ExpressionRewriteContext(ctx.cascadesContext)))
+
.toRule(ExpressionRuleType.SIMPLIFY_ARITHMETIC_COMPARISON)
);
}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyArithmeticRule.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyArithmeticRule.java
index b9fd91f6438..44d6505b003 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyArithmeticRule.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyArithmeticRule.java
@@ -19,6 +19,7 @@ package org.apache.doris.nereids.rules.expression.rules;
import org.apache.doris.nereids.rules.expression.ExpressionPatternMatcher;
import org.apache.doris.nereids.rules.expression.ExpressionPatternRuleFactory;
+import org.apache.doris.nereids.rules.expression.ExpressionRuleType;
import org.apache.doris.nereids.trees.expressions.Add;
import org.apache.doris.nereids.trees.expressions.BinaryArithmetic;
import org.apache.doris.nereids.trees.expressions.Divide;
@@ -52,6 +53,7 @@ public class SimplifyArithmeticRule implements
ExpressionPatternRuleFactory {
public List<ExpressionPatternMatcher<? extends Expression>> buildRules() {
return ImmutableList.of(
matchesTopType(BinaryArithmetic.class).then(SimplifyArithmeticRule::simplify)
+ .toRule(ExpressionRuleType.SIMPLIFY_ARITHMETIC)
);
}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyCastRule.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyCastRule.java
index cc044768056..8c3a5f21a30 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyCastRule.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyCastRule.java
@@ -19,6 +19,7 @@ package org.apache.doris.nereids.rules.expression.rules;
import org.apache.doris.nereids.rules.expression.ExpressionPatternMatcher;
import org.apache.doris.nereids.rules.expression.ExpressionPatternRuleFactory;
+import org.apache.doris.nereids.rules.expression.ExpressionRuleType;
import org.apache.doris.nereids.trees.expressions.Cast;
import org.apache.doris.nereids.trees.expressions.Expression;
import org.apache.doris.nereids.trees.expressions.literal.BigIntLiteral;
@@ -57,6 +58,7 @@ public class SimplifyCastRule implements
ExpressionPatternRuleFactory {
public List<ExpressionPatternMatcher<? extends Expression>> buildRules() {
return ImmutableList.of(
matchesType(Cast.class).then(SimplifyCastRule::simplifyCast)
+ .toRule(ExpressionRuleType.SIMPLIFY_CAST)
);
}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyComparisonPredicate.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyComparisonPredicate.java
index 1f435958202..e2bba0173b0 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyComparisonPredicate.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyComparisonPredicate.java
@@ -23,6 +23,7 @@ import
org.apache.doris.nereids.rules.expression.AbstractExpressionRewriteRule;
import org.apache.doris.nereids.rules.expression.ExpressionPatternMatcher;
import org.apache.doris.nereids.rules.expression.ExpressionPatternRuleFactory;
import org.apache.doris.nereids.rules.expression.ExpressionRewriteContext;
+import org.apache.doris.nereids.rules.expression.ExpressionRuleType;
import org.apache.doris.nereids.trees.expressions.Cast;
import org.apache.doris.nereids.trees.expressions.ComparisonPredicate;
import org.apache.doris.nereids.trees.expressions.EqualTo;
@@ -77,6 +78,7 @@ public class SimplifyComparisonPredicate extends
AbstractExpressionRewriteRule i
public List<ExpressionPatternMatcher<? extends Expression>> buildRules() {
return ImmutableList.of(
matchesType(ComparisonPredicate.class).then(SimplifyComparisonPredicate::simplify)
+
.toRule(ExpressionRuleType.SIMPLIFY_COMPARISON_PREDICATE)
);
}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyConditionalFunction.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyConditionalFunction.java
index c1c6283e32d..6862e138ac9 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyConditionalFunction.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyConditionalFunction.java
@@ -19,6 +19,7 @@ package org.apache.doris.nereids.rules.expression.rules;
import org.apache.doris.nereids.rules.expression.ExpressionPatternMatcher;
import org.apache.doris.nereids.rules.expression.ExpressionPatternRuleFactory;
+import org.apache.doris.nereids.rules.expression.ExpressionRuleType;
import org.apache.doris.nereids.trees.expressions.Expression;
import org.apache.doris.nereids.trees.expressions.functions.scalar.Coalesce;
import org.apache.doris.nereids.trees.expressions.functions.scalar.NullIf;
@@ -37,9 +38,12 @@ public class SimplifyConditionalFunction implements
ExpressionPatternRuleFactory
@Override
public List<ExpressionPatternMatcher<? extends Expression>> buildRules() {
return ImmutableList.of(
-
matchesType(Coalesce.class).then(SimplifyConditionalFunction::rewriteCoalesce),
-
matchesType(Nvl.class).then(SimplifyConditionalFunction::rewriteNvl),
+
matchesType(Coalesce.class).then(SimplifyConditionalFunction::rewriteCoalesce)
+
.toRule(ExpressionRuleType.SIMPLIFY_CONDITIONAL_FUNCTION),
+
matchesType(Nvl.class).then(SimplifyConditionalFunction::rewriteNvl)
+
.toRule(ExpressionRuleType.SIMPLIFY_CONDITIONAL_FUNCTION),
matchesType(NullIf.class).then(SimplifyConditionalFunction::rewriteNullIf)
+
.toRule(ExpressionRuleType.SIMPLIFY_CONDITIONAL_FUNCTION)
);
}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyInPredicate.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyInPredicate.java
index bf1b194a6ac..70a964929e2 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyInPredicate.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyInPredicate.java
@@ -19,6 +19,7 @@ package org.apache.doris.nereids.rules.expression.rules;
import org.apache.doris.nereids.rules.expression.ExpressionPatternMatcher;
import org.apache.doris.nereids.rules.expression.ExpressionPatternRuleFactory;
+import org.apache.doris.nereids.rules.expression.ExpressionRuleType;
import org.apache.doris.nereids.trees.expressions.Cast;
import org.apache.doris.nereids.trees.expressions.Expression;
import org.apache.doris.nereids.trees.expressions.InPredicate;
@@ -40,6 +41,7 @@ public class SimplifyInPredicate implements
ExpressionPatternRuleFactory {
public List<ExpressionPatternMatcher<? extends Expression>> buildRules() {
return ImmutableList.of(
matchesType(InPredicate.class).then(SimplifyInPredicate::simplify)
+ .toRule(ExpressionRuleType.SIMPLIFY_IN_PREDICATE)
);
}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyNotExprRule.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyNotExprRule.java
index 92ea5ddfd5c..413966514f6 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyNotExprRule.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyNotExprRule.java
@@ -19,6 +19,7 @@ package org.apache.doris.nereids.rules.expression.rules;
import org.apache.doris.nereids.rules.expression.ExpressionPatternMatcher;
import org.apache.doris.nereids.rules.expression.ExpressionPatternRuleFactory;
+import org.apache.doris.nereids.rules.expression.ExpressionRuleType;
import org.apache.doris.nereids.trees.expressions.ComparisonPredicate;
import org.apache.doris.nereids.trees.expressions.CompoundPredicate;
import org.apache.doris.nereids.trees.expressions.Expression;
@@ -55,6 +56,7 @@ public class SimplifyNotExprRule implements
ExpressionPatternRuleFactory {
public List<ExpressionPatternMatcher<? extends Expression>> buildRules() {
return ImmutableList.of(
matchesType(Not.class).then(SimplifyNotExprRule::simplify)
+ .toRule(ExpressionRuleType.SIMPLIFY_NOT_EXPR)
);
}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyRange.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyRange.java
index 4666342943a..576ef6bbf4d 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyRange.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyRange.java
@@ -20,6 +20,7 @@ package org.apache.doris.nereids.rules.expression.rules;
import org.apache.doris.nereids.rules.expression.ExpressionPatternMatcher;
import org.apache.doris.nereids.rules.expression.ExpressionPatternRuleFactory;
import org.apache.doris.nereids.rules.expression.ExpressionRewriteContext;
+import org.apache.doris.nereids.rules.expression.ExpressionRuleType;
import
org.apache.doris.nereids.rules.expression.rules.RangeInference.DiscreteValue;
import
org.apache.doris.nereids.rules.expression.rules.RangeInference.EmptyValue;
import
org.apache.doris.nereids.rules.expression.rules.RangeInference.RangeValue;
@@ -76,6 +77,7 @@ public class SimplifyRange implements
ExpressionPatternRuleFactory {
return ImmutableList.of(
matchesTopType(CompoundPredicate.class)
.thenApply(ctx -> rewrite(ctx.expr,
ctx.rewriteContext))
+ .toRule(ExpressionRuleType.SIMPLIFY_RANGE)
);
}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SupportJavaDateFormatter.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SupportJavaDateFormatter.java
index f5b442a3989..fbf59ab624b 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SupportJavaDateFormatter.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SupportJavaDateFormatter.java
@@ -19,6 +19,7 @@ package org.apache.doris.nereids.rules.expression.rules;
import org.apache.doris.nereids.rules.expression.ExpressionPatternMatcher;
import org.apache.doris.nereids.rules.expression.ExpressionPatternRuleFactory;
+import org.apache.doris.nereids.rules.expression.ExpressionRuleType;
import org.apache.doris.nereids.trees.expressions.Expression;
import org.apache.doris.nereids.trees.expressions.functions.scalar.DateFormat;
import
org.apache.doris.nereids.trees.expressions.functions.scalar.FromUnixtime;
@@ -38,9 +39,12 @@ public class SupportJavaDateFormatter implements
ExpressionPatternRuleFactory {
@Override
public List<ExpressionPatternMatcher<? extends Expression>> buildRules() {
return ImmutableList.of(
-
matchesType(DateFormat.class).then(SupportJavaDateFormatter::rewriteDateFormat),
-
matchesType(FromUnixtime.class).then(SupportJavaDateFormatter::rewriteFromUnixtime),
+
matchesType(DateFormat.class).then(SupportJavaDateFormatter::rewriteDateFormat)
+
.toRule(ExpressionRuleType.SUPPORT_JAVA_DATE_FORMATTER),
+
matchesType(FromUnixtime.class).then(SupportJavaDateFormatter::rewriteFromUnixtime)
+
.toRule(ExpressionRuleType.SUPPORT_JAVA_DATE_FORMATTER),
matchesType(UnixTimestamp.class).then(SupportJavaDateFormatter::rewriteUnixTimestamp)
+ .toRule(ExpressionRuleType.SUPPORT_JAVA_DATE_FORMATTER)
);
}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/TopnToMax.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/TopnToMax.java
index 318cb6ec603..972018b4244 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/TopnToMax.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/TopnToMax.java
@@ -19,6 +19,7 @@ package org.apache.doris.nereids.rules.expression.rules;
import org.apache.doris.nereids.rules.expression.ExpressionPatternMatcher;
import org.apache.doris.nereids.rules.expression.ExpressionPatternRuleFactory;
+import org.apache.doris.nereids.rules.expression.ExpressionRuleType;
import org.apache.doris.nereids.trees.expressions.Expression;
import org.apache.doris.nereids.trees.expressions.functions.agg.Max;
import org.apache.doris.nereids.trees.expressions.functions.agg.TopN;
@@ -39,6 +40,7 @@ public class TopnToMax implements
ExpressionPatternRuleFactory {
public List<ExpressionPatternMatcher<? extends Expression>> buildRules() {
return ImmutableList.of(
matchesTopType(TopN.class).then(TopnToMax::rewrite)
+ .toRule(ExpressionRuleType.TOPN_TO_MAX)
);
}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/ExprIdRewriter.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/ExprIdRewriter.java
index 60c9da4bc6e..9dfe4e84faa 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/ExprIdRewriter.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/ExprIdRewriter.java
@@ -28,6 +28,7 @@ import
org.apache.doris.nereids.rules.expression.ExpressionPatternRuleFactory;
import org.apache.doris.nereids.rules.expression.ExpressionRewrite;
import org.apache.doris.nereids.rules.expression.ExpressionRewriteContext;
import org.apache.doris.nereids.rules.expression.ExpressionRuleExecutor;
+import org.apache.doris.nereids.rules.expression.ExpressionRuleType;
import org.apache.doris.nereids.trees.expressions.ExprId;
import org.apache.doris.nereids.trees.expressions.Expression;
import org.apache.doris.nereids.trees.expressions.NamedExpression;
@@ -125,7 +126,7 @@ public class ExprIdRewriter extends ExpressionRewrite {
return slot.withExprId(newId);
}
return slot;
- })
+ }).toRule(ExpressionRuleType.EXPR_ID_REWRITE_REPLACE)
);
}
}
diff --git a/fe/fe-core/src/main/java/org/apache/doris/qe/SessionVariable.java
b/fe/fe-core/src/main/java/org/apache/doris/qe/SessionVariable.java
index 4f7506e30dc..18289a23bd4 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/qe/SessionVariable.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/qe/SessionVariable.java
@@ -34,6 +34,7 @@ import org.apache.doris.nereids.metrics.Event;
import org.apache.doris.nereids.metrics.EventSwitchParser;
import org.apache.doris.nereids.parser.Dialect;
import org.apache.doris.nereids.rules.RuleType;
+import org.apache.doris.nereids.rules.expression.ExpressionRuleType;
import
org.apache.doris.nereids.trees.plans.commands.insert.InsertIntoTableCommand;
import org.apache.doris.nereids.trees.plans.logical.LogicalFileSink;
import org.apache.doris.nereids.trees.plans.logical.LogicalPlan;
@@ -332,6 +333,7 @@ public class SessionVariable implements Serializable,
Writable {
public static final String ENABLE_NEREIDS_DISTRIBUTE_PLANNER =
"enable_nereids_distribute_planner";
public static final String DISABLE_NEREIDS_RULES = "disable_nereids_rules";
public static final String ENABLE_NEREIDS_RULES = "enable_nereids_rules";
+ public static final String DISABLE_NEREIDS_EXPRESSION_RULES =
"disable_nereids_expression_rules";
public static final String ENABLE_NEW_COST_MODEL = "enable_new_cost_model";
public static final String ENABLE_FALLBACK_TO_ORIGINAL_PLANNER =
"enable_fallback_to_original_planner";
public static final String ENABLE_NEREIDS_TIMEOUT =
"enable_nereids_timeout";
@@ -1438,6 +1440,12 @@ public class SessionVariable implements Serializable,
Writable {
@VariableMgr.VarAttr(name = ENABLE_NEREIDS_RULES, needForward = true)
public String enableNereidsRules = "";
+ @VariableMgr.VarAttr(name = DISABLE_NEREIDS_EXPRESSION_RULES, needForward
= true,
+ setter = "setDisableNereidsExpressionRules")
+ private String disableNereidsExpressionRules = "";
+
+ private BitSet disableNereidsExpressionRuleSet = new BitSet();
+
@VariableMgr.VarAttr(name = ENABLE_NEW_COST_MODEL, needForward = true)
private boolean enableNewCostModel = false;
@@ -3653,6 +3661,10 @@ public class SessionVariable implements Serializable,
Writable {
.collect(ImmutableSet.toImmutableSet());
}
+ public BitSet getDisableNereidsExpressionRules() {
+ return disableNereidsExpressionRuleSet;
+ }
+
public void setEnableNewCostModel(boolean enable) {
this.enableNewCostModel = enable;
}
@@ -3665,6 +3677,20 @@ public class SessionVariable implements Serializable,
Writable {
this.disableNereidsRules = disableNereidsRules;
}
+ public void setDisableNereidsExpressionRules(String
disableNereidsExpressionRules) {
+ BitSet bitSet = new BitSet();
+ for (String ruleName : disableNereidsExpressionRules.split(",")) {
+ ruleName = ruleName.trim().toUpperCase(Locale.ROOT);
+ if (ruleName.isEmpty()) {
+ continue;
+ }
+ ExpressionRuleType ruleType = ExpressionRuleType.valueOf(ruleName);
+ bitSet.set(ruleType.type());
+ }
+ this.disableNereidsExpressionRuleSet = bitSet;
+ this.disableNereidsExpressionRules = disableNereidsExpressionRules;
+ }
+
public double getNereidsCboPenaltyFactor() {
return nereidsCboPenaltyFactor;
}
diff --git
a/regression-test/data/nereids_rules_p0/expression/test_disable_nereids_expression_rule.out
b/regression-test/data/nereids_rules_p0/expression/test_disable_nereids_expression_rule.out
new file mode 100644
index 00000000000..a9cf8afc2e5
--- /dev/null
+++
b/regression-test/data/nereids_rules_p0/expression/test_disable_nereids_expression_rule.out
@@ -0,0 +1,10 @@
+-- This file is automatically generated. You should know what you did if you
want to edit this
+-- !shape_1 --
+PhysicalResultSink
+--PhysicalEmptyRelation
+
+-- !shape_2 --
+PhysicalResultSink
+--filter((cast(a as DECIMALV3(11, 1)) = 1.1))
+----PhysicalOlapScan[test_disable_nereids_expression_rule_tbl]
+
diff --git
a/regression-test/suites/nereids_rules_p0/expression/test_disable_nereids_expression_rule.groovy
b/regression-test/suites/nereids_rules_p0/expression/test_disable_nereids_expression_rule.groovy
new file mode 100644
index 00000000000..fda16071e16
--- /dev/null
+++
b/regression-test/suites/nereids_rules_p0/expression/test_disable_nereids_expression_rule.groovy
@@ -0,0 +1,28 @@
+// 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.
+
+suite('test_disable_nereids_expression_rule') {
+ def tbl = 'test_disable_nereids_expression_rule_tbl'
+ sql "DROP TABLE IF EXISTS ${tbl}"
+ sql "CREATE TABLE ${tbl}(a INT) PROPERTIES('replication_num' = '1')"
+ sql "INSERT INTO ${tbl} VALUES(10)"
+ sql "SET enable_parallel_result_sink=true"
+ qt_shape_1 "EXPLAIN SHAPE PLAN SELECT * FROM ${tbl} WHERE a = 1.1"
+ sql "SET disable_nereids_expression_rules='SIMPLIFY_COMPARISON_PREDICATE'"
+ qt_shape_2 "EXPLAIN SHAPE PLAN SELECT * FROM ${tbl} WHERE a = 1.1"
+ sql "DROP TABLE IF EXISTS ${tbl}"
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]