This is an automated email from the ASF dual-hosted git repository.
yiguolei pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-doris.git
The following commit(s) were added to refs/heads/master by this push:
new 35f99faa0a [Bug][Vectorized] fix core dump on vcase_expr::close (#9893)
35f99faa0a is described below
commit 35f99faa0a6662247cfb847dd9e0753144e36913
Author: HappenLee <[email protected]>
AuthorDate: Wed Jun 1 08:05:09 2022 +0800
[Bug][Vectorized] fix core dump on vcase_expr::close (#9893)
Co-authored-by: lihaopeng <[email protected]>
---
be/src/vec/exec/volap_scanner.cpp | 3 ---
be/src/vec/exprs/vcase_expr.cpp | 16 ++++++++++++----
be/src/vec/exprs/vexpr.h | 5 +----
be/src/vec/functions/function_case.h | 11 +----------
be/src/vec/utils/util.hpp | 13 +++++++++++--
5 files changed, 25 insertions(+), 23 deletions(-)
diff --git a/be/src/vec/exec/volap_scanner.cpp
b/be/src/vec/exec/volap_scanner.cpp
index b9cef0adfc..5a739f4f0b 100644
--- a/be/src/vec/exec/volap_scanner.cpp
+++ b/be/src/vec/exec/volap_scanner.cpp
@@ -20,10 +20,7 @@
#include <memory>
#include "runtime/runtime_state.h"
-#include "vec/columns/column_complex.h"
-#include "vec/columns/column_nullable.h"
#include "vec/columns/column_string.h"
-#include "vec/columns/column_vector.h"
#include "vec/common/assert_cast.h"
#include "vec/core/block.h"
#include "vec/exec/volap_scan_node.h"
diff --git a/be/src/vec/exprs/vcase_expr.cpp b/be/src/vec/exprs/vcase_expr.cpp
index 20ad1fe340..2683e33bba 100644
--- a/be/src/vec/exprs/vcase_expr.cpp
+++ b/be/src/vec/exprs/vcase_expr.cpp
@@ -68,15 +68,23 @@ Status VCaseExpr::open(RuntimeState* state, VExprContext*
context,
FunctionContext::FunctionStateScope scope) {
RETURN_IF_ERROR(VExpr::open(state, context, scope));
RETURN_IF_ERROR(VExpr::init_function_context(context, scope, _function));
-
- CaseState* case_state = new CaseState {_data_type};
- context->fn_context(_fn_context_index)->set_function_state(scope,
case_state);
-
+ if (scope == doris_udf::FunctionContext::FRAGMENT_LOCAL) {
+ auto* case_state = new CaseState {_data_type};
+ context->fn_context(_fn_context_index)
+ ->set_function_state(FunctionContext::FRAGMENT_LOCAL,
case_state);
+ }
return Status::OK();
}
void VCaseExpr::close(RuntimeState* state, VExprContext* context,
FunctionContext::FunctionStateScope scope) {
+ if (scope == doris_udf::FunctionContext::FRAGMENT_LOCAL) {
+ auto* case_state = reinterpret_cast<CaseState*>(
+ context->fn_context(_fn_context_index)
+ ->get_function_state(FunctionContext::FRAGMENT_LOCAL));
+ delete case_state;
+ }
+
VExpr::close_function_context(context, scope, _function);
VExpr::close(state, context, scope);
}
diff --git a/be/src/vec/exprs/vexpr.h b/be/src/vec/exprs/vexpr.h
index f205e62c10..ff04fccdfb 100644
--- a/be/src/vec/exprs/vexpr.h
+++ b/be/src/vec/exprs/vexpr.h
@@ -108,10 +108,7 @@ public:
VExpr* parent, int* node_idx,
VExpr** root_expr,
VExprContext** ctx);
const std::vector<VExpr*>& children() const { return _children; }
- void set_children(RuntimeState* state, VExprContext* ctx,
std::vector<VExpr*> children) {
- close(state, ctx, ctx->get_function_state_scope());
- _children = children;
- }
+ void set_children(std::vector<VExpr*> children) { _children = children; }
virtual std::string debug_string() const;
static std::string debug_string(const std::vector<VExpr*>& exprs);
static std::string debug_string(const std::vector<VExprContext*>& ctxs);
diff --git a/be/src/vec/functions/function_case.h
b/be/src/vec/functions/function_case.h
index 5210ac80ad..47e33f58ff 100644
--- a/be/src/vec/functions/function_case.h
+++ b/be/src/vec/functions/function_case.h
@@ -327,21 +327,12 @@ public:
Status execute_impl(FunctionContext* context, Block& block, const
ColumnNumbers& arguments,
size_t result, size_t input_rows_count) override {
- CaseState* case_state = reinterpret_cast<CaseState*>(
+ auto* case_state = reinterpret_cast<CaseState*>(
context->get_function_state(FunctionContext::FRAGMENT_LOCAL));
return execute_get_type(case_state->result_type, block, arguments,
result,
input_rows_count);
}
-
- Status close(FunctionContext* context, FunctionContext::FunctionStateScope
scope) override {
- if (scope == FunctionContext::THREAD_LOCAL) {
- auto* state = reinterpret_cast<CaseState*>(
-
context->get_function_state(FunctionContext::THREAD_LOCAL));
- delete state;
- }
- return Status::OK();
- }
};
} // namespace doris::vectorized
diff --git a/be/src/vec/utils/util.hpp b/be/src/vec/utils/util.hpp
index 8e50d12b5d..0df02ddd6a 100644
--- a/be/src/vec/utils/util.hpp
+++ b/be/src/vec/utils/util.hpp
@@ -69,7 +69,11 @@ public:
static constexpr auto is_leaf = [](VExpr* expr) { return
!expr->is_and_expr(); };
if (is_leaf(expr)) {
- return checker(leaf_index++) ? nullptr : expr;
+ if (checker(leaf_index++)) {
+ expr->close(state, context,
context->get_function_state_scope());
+ return nullptr;
+ }
+ return expr;
} else {
VExpr* left_child =
dfs_peel_conjunct(state, context, expr->children()[0],
leaf_index, checker);
@@ -77,9 +81,14 @@ public:
dfs_peel_conjunct(state, context, expr->children()[1],
leaf_index, checker);
if (left_child != nullptr && right_child != nullptr) {
- expr->set_children(state, context, {left_child, right_child});
+ expr->set_children({left_child, right_child});
return expr;
+ } else {
+ // here only close the and expr self, do not close the child
+ expr->set_children({});
+ expr->close(state, context,
context->get_function_state_scope());
}
+
// here do not close Expr* now
return left_child != nullptr ? left_child : right_child;
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]