[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
This commit is contained in:
morrySnow
2023-03-02 19:16:23 +08:00
committed by GitHub
parent 27352afdf6
commit a1399043fe
2 changed files with 7 additions and 3 deletions

View File

@ -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);
}

View File

@ -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<ExprId> idGenerator = ExprId.createGenerator();
@ -80,7 +80,11 @@ public class FoldConstantRuleOnBE extends AbstractExpressionRewriteRule {
private Expression foldByBE(Expression root, ExpressionRewriteContext context) {
Map<String, Expression> constMap = Maps.newHashMap();
Map<String, TExpr> 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;
}