From ef5f71d18cd75a543e9d03a30aa79883d579cb2b Mon Sep 17 00:00:00 2001 From: starocean999 <12095047@qq.com> Date: Sun, 27 Aug 2023 00:01:53 +0800 Subject: [PATCH] [fix](planner)only forbid substitute literal expr in function call expr --- .../doris/analysis/FunctionCallExpr.java | 25 ++++++++++++++++++- .../apache/doris/analysis/LiteralExpr.java | 6 ----- 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/FunctionCallExpr.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/FunctionCallExpr.java index 9abd91acad7c26..17112e1f03deaf 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/FunctionCallExpr.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/FunctionCallExpr.java @@ -478,7 +478,30 @@ protected Expr substituteImpl(ExprSubstitutionMap smap, ExprSubstitutionMap disj aggFnParams = aggFnParams .clone(newParams); } - return super.substituteImpl(smap, disjunctsMap, analyzer); + if (isImplicitCast()) { + return getChild(0).substituteImpl(smap, disjunctsMap, analyzer); + } + if (smap != null) { + Expr substExpr = smap.get(this); + if (substExpr != null) { + return substExpr.clone(); + } + } + if (Expr.IS_OR_PREDICATE.apply(this) && disjunctsMap != null) { + smap = disjunctsMap; + disjunctsMap = null; + } + for (int i = 0; i < children.size(); ++i) { + // we shouldn't change literal expr in function call expr + if (!(children.get(i) instanceof LiteralExpr)) { + children.set(i, children.get(i).substituteImpl(smap, disjunctsMap, analyzer)); + } + } + // SlotRefs must remain analyzed to support substitution across query blocks. All + // other exprs must be analyzed again after the substitution to add implicit casts + // and for resolving their correct function signature. + resetAnalysisState(); + return this; } @Override diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/LiteralExpr.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/LiteralExpr.java index 2e2eed316b2586..bde041aeefa73e 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/LiteralExpr.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/LiteralExpr.java @@ -402,10 +402,4 @@ public static int getParmLen(ByteBuffer data) { public boolean matchExprs(List exprs, SelectStmt stmt, boolean ignoreAlias, TupleDescriptor tuple) { return true; } - - @Override - protected Expr substituteImpl(ExprSubstitutionMap smap, ExprSubstitutionMap disjunctsMap, - Analyzer analyzer) { - return this; - } }