From a1399043fe054bdfe5ca475075e9414add80378e Mon Sep 17 00:00:00 2001 From: morrySnow <101034200+morrySnow@users.noreply.github.com> Date: Thu, 2 Mar 2023 19:16:23 +0800 Subject: [PATCH] [fix](Nereids) fold constant on BE could not process alias (#17259) 1. could not use static INSTANCE for FoldConstantOnBE rule, because it is stateful 2. if expression root is Alias, should use its child to do const collection --- .../rules/expression/rewrite/rules/FoldConstantRule.java | 2 +- .../expression/rewrite/rules/FoldConstantRuleOnBE.java | 8 ++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rewrite/rules/FoldConstantRule.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rewrite/rules/FoldConstantRule.java index 175e40b0aa..9ec497c576 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rewrite/rules/FoldConstantRule.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rewrite/rules/FoldConstantRule.java @@ -31,7 +31,7 @@ public class FoldConstantRule extends AbstractExpressionRewriteRule { @Override public Expression rewrite(Expression expr, ExpressionRewriteContext ctx) { if (ctx.connectContext != null && ctx.connectContext.getSessionVariable().isEnableFoldConstantByBe()) { - return FoldConstantRuleOnBE.INSTANCE.rewrite(expr, ctx); + return new FoldConstantRuleOnBE().rewrite(expr, ctx); } return FoldConstantRuleOnFE.INSTANCE.rewrite(expr, ctx); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rewrite/rules/FoldConstantRuleOnBE.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rewrite/rules/FoldConstantRuleOnBE.java index 09751d7d21..284313035b 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rewrite/rules/FoldConstantRuleOnBE.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rewrite/rules/FoldConstantRuleOnBE.java @@ -30,6 +30,7 @@ import org.apache.doris.common.util.VectorizedUtil; import org.apache.doris.nereids.glue.translator.ExpressionTranslator; import org.apache.doris.nereids.rules.expression.rewrite.AbstractExpressionRewriteRule; import org.apache.doris.nereids.rules.expression.rewrite.ExpressionRewriteContext; +import org.apache.doris.nereids.trees.expressions.Alias; import org.apache.doris.nereids.trees.expressions.Between; import org.apache.doris.nereids.trees.expressions.Cast; import org.apache.doris.nereids.trees.expressions.Expression; @@ -66,7 +67,6 @@ import java.util.concurrent.TimeUnit; * Constant evaluation of an expression. */ public class FoldConstantRuleOnBE extends AbstractExpressionRewriteRule { - public static final FoldConstantRuleOnBE INSTANCE = new FoldConstantRuleOnBE(); private static final Logger LOG = LogManager.getLogger(FoldConstantRuleOnBE.class); private static final DateTimeFormatter DATE_FORMAT = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); private final IdGenerator idGenerator = ExprId.createGenerator(); @@ -80,7 +80,11 @@ public class FoldConstantRuleOnBE extends AbstractExpressionRewriteRule { private Expression foldByBE(Expression root, ExpressionRewriteContext context) { Map constMap = Maps.newHashMap(); Map staleConstTExprMap = Maps.newHashMap(); - collectConst(root, constMap, staleConstTExprMap); + Expression rootWithoutAlias = root; + if (root instanceof Alias) { + rootWithoutAlias = ((Alias) root).child(); + } + collectConst(rootWithoutAlias, constMap, staleConstTExprMap); if (constMap.isEmpty()) { return root; }