From 475f9840ca961a3db598ce9da9a016acd40e79bc Mon Sep 17 00:00:00 2001 From: starocean999 <40539150+starocean999@users.noreply.github.com> Date: Sun, 27 Aug 2023 00:16:09 +0800 Subject: [PATCH] [fix](planner)only forbid substitute literal expr in function call expr (#23533) pick from master #23532 --- .../doris/analysis/FunctionCallExpr.java | 24 ++++++++++++++++++- .../apache/doris/analysis/LiteralExpr.java | 6 ----- 2 files changed, 23 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 0929c24770ca51..76c2fe825acb40 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 @@ -460,7 +460,29 @@ 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) { + 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 c52d77b2ee7022..022f1b41d670c1 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 @@ -267,10 +267,4 @@ public void finalizeImplForNereids() throws AnalysisException { public String toString() { return getStringValue(); } - - @Override - protected Expr substituteImpl(ExprSubstitutionMap smap, ExprSubstitutionMap disjunctsMap, - Analyzer analyzer) { - return this; - } }