From 896ddd82d6075b3294dddf9a3e459c8af6a2d645 Mon Sep 17 00:00:00 2001 From: Jerry Hu Date: Tue, 28 Feb 2023 18:12:01 +0800 Subject: [PATCH] [fix](vec) avoid stack overflow when expr tree is too deep --- be/src/vec/exprs/vexpr.cpp | 3 --- be/src/vec/exprs/vexpr_context.cpp | 20 +++++++++++++++++++- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/be/src/vec/exprs/vexpr.cpp b/be/src/vec/exprs/vexpr.cpp index f90993884d2d6f..4bf08bc6f5a2f9 100644 --- a/be/src/vec/exprs/vexpr.cpp +++ b/be/src/vec/exprs/vexpr.cpp @@ -85,9 +85,6 @@ VExpr::VExpr(const TypeDescriptor& type, bool is_slotref, bool is_nullable) } Status VExpr::prepare(RuntimeState* state, const RowDescriptor& row_desc, VExprContext* context) { - for (int i = 0; i < _children.size(); ++i) { - RETURN_IF_ERROR(_children[i]->prepare(state, row_desc, context)); - } return Status::OK(); } diff --git a/be/src/vec/exprs/vexpr_context.cpp b/be/src/vec/exprs/vexpr_context.cpp index 90332452026281..22e0e809bdfee6 100644 --- a/be/src/vec/exprs/vexpr_context.cpp +++ b/be/src/vec/exprs/vexpr_context.cpp @@ -49,7 +49,25 @@ doris::Status VExprContext::prepare(doris::RuntimeState* state, const doris::RowDescriptor& row_desc) { _prepared = true; _pool.reset(new MemPool()); - return _root->prepare(state, row_desc, this); + std::stack stack; + stack.push(_root); + + std::vector flatted; + + while (!stack.empty()) { + auto* top = stack.top(); + flatted.emplace_back(top); + stack.pop(); + for (auto* child : top->children()) { + stack.push(child); + } + } + + for (ssize_t i = flatted.size() - 1; i >= 0; --i) { + RETURN_IF_ERROR(flatted[i]->prepare(state, row_desc, this)); + } + + return Status::OK(); } doris::Status VExprContext::open(doris::RuntimeState* state) {