This is an automated email from the ASF dual-hosted git repository. morningman pushed a commit to branch dev-1.0.1-v20220709 in repository https://gitbox.apache.org/repos/asf/doris.git
commit 3d1d8ebdce6edcb9b02d8598b830e3293b7b097d Author: morningman <morning...@apache.org> AuthorDate: Sat Jul 9 12:39:01 2022 +0800 [tmpfix] expr compose and replace bug --- be/src/vec/exprs/vslot_ref.cpp | 5 +++-- .../apache/doris/analysis/ExprSubstitutionMap.java | 23 +++++++++++++++++----- .../org/apache/doris/planner/HashJoinNode.java | 2 +- 3 files changed, 22 insertions(+), 8 deletions(-) diff --git a/be/src/vec/exprs/vslot_ref.cpp b/be/src/vec/exprs/vslot_ref.cpp index 57038eb63f..8cbc56cb37 100644 --- a/be/src/vec/exprs/vslot_ref.cpp +++ b/be/src/vec/exprs/vslot_ref.cpp @@ -20,6 +20,7 @@ #include <fmt/format.h> #include "runtime/descriptors.h" +#include "util/stack_util.h" namespace doris::vectorized { using doris::Status; @@ -59,7 +60,7 @@ Status VSlotRef::prepare(doris::RuntimeState* state, const doris::RowDescriptor& } Status VSlotRef::execute(VExprContext* context, Block* block, int* result_column_id) { - DCHECK_GE(_column_id, 0); + CHECK_GE(_column_id, 0) << ", " << debug_string() << ", " << get_stack_trace(); *result_column_id = _column_id; return Status::OK(); } @@ -69,7 +70,7 @@ const std::string& VSlotRef::expr_name() const { } std::string VSlotRef::debug_string() const { std::stringstream out; - out << "SlotRef(slot_id=" << _slot_id << VExpr::debug_string() << ")"; + out << "SlotRef(slot_id=" << _slot_id << VExpr::debug_string() << ") column id: " << _column_id << ", name: " << *_column_name << ", is nulable: " << _is_nullable; return out.str(); } } // namespace doris::vectorized diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/ExprSubstitutionMap.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/ExprSubstitutionMap.java index e0df525ce5..6fe94f8578 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/ExprSubstitutionMap.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/ExprSubstitutionMap.java @@ -17,6 +17,8 @@ package org.apache.doris.analysis; +import org.apache.doris.common.AnalysisException; + import java.util.List; import java.util.Objects; @@ -189,7 +191,7 @@ public final class ExprSubstitutionMap { * f [A.id, B.id] [A.name, B.name] g [A.id, C.id] [A.age, C.age] * return: [A.id, C,id] [A.name, B.name] [A.age, C.age] */ - public static ExprSubstitutionMap composeAndReplace(ExprSubstitutionMap f, ExprSubstitutionMap g) { + public static ExprSubstitutionMap composeAndReplace(ExprSubstitutionMap f, ExprSubstitutionMap g, Analyzer analyzer) throws AnalysisException { if (f == null && g == null) { return new ExprSubstitutionMap(); } @@ -200,11 +202,22 @@ public final class ExprSubstitutionMap { return f; } ExprSubstitutionMap result = new ExprSubstitutionMap(); - result = ExprSubstitutionMap.combine(result, g); + // compose f and g for (int i = 0; i < g.size(); i++) { - // case a->b, b->c => a->c - if (f.mappingForRhsExpr(g.getLhs().get(i)) != null) { - result.getLhs().set(i, f.mappingForRhsExpr(g.getLhs().get(i))); + boolean findGMatch = false; + Expr gLhs = g.getLhs().get(i); + for (int j = 0; j < f.size(); j++) { + // case a->fn(b), b->c => a->fn(c) + Expr fRhs = f.getRhs().get(j); + if (fRhs.contains(gLhs)) { + Expr newRhs = fRhs.trySubstitute(g, analyzer, false); + result.put(f.getLhs().get(j), newRhs); + findGMatch = true; + break; + } + } + if (!findGMatch) { + result.put(g.getLhs().get(i), g.getRhs().get(i)); } } // add remaining f diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/HashJoinNode.java b/fe/fe-core/src/main/java/org/apache/doris/planner/HashJoinNode.java index 16e82b644f..f0c20ebec1 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/planner/HashJoinNode.java +++ b/fe/fe-core/src/main/java/org/apache/doris/planner/HashJoinNode.java @@ -441,7 +441,7 @@ public class HashJoinNode extends PlanNode { } } // 4. change the outputSmap - outputSmap = ExprSubstitutionMap.composeAndReplace(outputSmap, srcTblRefToOutputTupleSmap); + outputSmap = ExprSubstitutionMap.composeAndReplace(outputSmap, srcTblRefToOutputTupleSmap, analyzer); } private void replaceOutputSmapForOuterJoin() { --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org