This is an automated email from the ASF dual-hosted git repository.
morningman pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/master by this push:
new e04c13b7a6 [enhancement](exception safe) make function state exception
safe (#16771)
e04c13b7a6 is described below
commit e04c13b7a636687d871d528c3935254a0933ab49
Author: yiguolei <[email protected]>
AuthorDate: Mon Feb 20 23:01:45 2023 +0800
[enhancement](exception safe) make function state exception safe (#16771)
---
be/src/exprs/json_functions.cpp | 34 -----------------------
be/src/exprs/json_functions.h | 3 --
be/src/exprs/string_functions.cpp | 15 +++++-----
be/src/exprs/string_functions.h | 4 +--
be/src/olap/in_list_predicate.h | 15 +---------
be/src/olap/like_column_predicate.cpp | 10 +++----
be/src/olap/like_column_predicate.h | 1 -
be/src/udf/udf.cpp | 10 +++----
be/src/udf/udf.h | 3 +-
be/src/udf/udf_internal.h | 4 +--
be/src/vec/functions/function_convert_tz.h | 8 +-----
be/src/vec/functions/function_java_udf.cpp | 10 +++----
be/src/vec/functions/function_java_udf.h | 14 ++++++++--
be/src/vec/functions/function_regexp.cpp | 44 ++++++++++++++----------------
be/src/vec/functions/function_string.h | 23 ++++++++++------
be/src/vec/functions/functions_geo.cpp | 23 ++--------------
be/src/vec/functions/in.h | 6 +---
be/src/vec/functions/like.cpp | 9 ++----
be/src/vec/functions/random.cpp | 14 +---------
19 files changed, 83 insertions(+), 167 deletions(-)
diff --git a/be/src/exprs/json_functions.cpp b/be/src/exprs/json_functions.cpp
index 8600fd9041..3016463482 100644
--- a/be/src/exprs/json_functions.cpp
+++ b/be/src/exprs/json_functions.cpp
@@ -43,40 +43,6 @@ namespace doris {
// json path cannot contains: ", [, ]
static const re2::RE2 JSON_PATTERN("^([^\\\"\\[\\]]*)(?:\\[([0-9]+|\\*)\\])?");
-rapidjson::Value JsonFunctions::parse_str_with_flag(const StringVal& arg,
const StringVal& flag,
- const int num,
-
rapidjson::Document::AllocatorType& allocator) {
- rapidjson::Value val;
- if (arg.is_null || *(flag.ptr + num) == '0') { //null
- rapidjson::Value nullObject(rapidjson::kNullType);
- val = nullObject;
- } else if (*(flag.ptr + num) == '1') { //bool
- bool res = ((arg == "1") ? true : false);
- val.SetBool(res);
- } else if (*(flag.ptr + num) == '2') { //int
- std::stringstream ss;
- ss << arg.ptr;
- int number = 0;
- ss >> number;
- val.SetInt(number);
- } else if (*(flag.ptr + num) == '3') { //double
- std::stringstream ss;
- ss << arg.ptr;
- double number = 0.0;
- ss >> number;
- val.SetDouble(number);
- } else if (*(flag.ptr + num) == '4' || *(flag.ptr + num) == '5') {
- StringPiece str((char*)arg.ptr, arg.len);
- if (*(flag.ptr + num) == '4') {
- str = str.substr(1, str.length() - 2);
- }
- val.SetString(str.data(), str.length(), allocator);
- } else {
- DCHECK(false) << "parse json type error with unknown type";
- }
- return val;
-}
-
rapidjson::Value* JsonFunctions::match_value(const std::vector<JsonPath>&
parsed_paths,
rapidjson::Value* document,
rapidjson::Document::AllocatorType& mem_allocator,
diff --git a/be/src/exprs/json_functions.h b/be/src/exprs/json_functions.h
index 5740427867..39fbda875b 100644
--- a/be/src/exprs/json_functions.h
+++ b/be/src/exprs/json_functions.h
@@ -121,8 +121,5 @@ private:
bool is_insert_null = false);
static void get_parsed_paths(const std::vector<std::string>& path_exprs,
std::vector<JsonPath>* parsed_paths);
- static rapidjson::Value parse_str_with_flag(const StringVal& arg, const
StringVal& flag,
- const int num,
-
rapidjson::Document::AllocatorType& allocator);
};
} // namespace doris
diff --git a/be/src/exprs/string_functions.cpp
b/be/src/exprs/string_functions.cpp
index 4ef1039c73..a9b4b737e8 100644
--- a/be/src/exprs/string_functions.cpp
+++ b/be/src/exprs/string_functions.cpp
@@ -62,8 +62,9 @@ bool StringFunctions::set_re2_options(const StringVal&
match_parameter, std::str
}
// The caller owns the returned regex. Returns nullptr if the pattern could
not be compiled.
-re2::RE2* StringFunctions::compile_regex(const StringVal& pattern,
std::string* error_str,
- const StringVal& match_parameter) {
+bool StringFunctions::compile_regex(const StringVal& pattern, std::string*
error_str,
+ const StringVal& match_parameter,
+ std::unique_ptr<re2::RE2>& re) {
re2::StringPiece pattern_sp(reinterpret_cast<char*>(pattern.ptr),
pattern.len);
re2::RE2::Options options;
// Disable error logging in case e.g. every row causes an error
@@ -74,19 +75,19 @@ re2::RE2* StringFunctions::compile_regex(const StringVal&
pattern, std::string*
options.set_dot_nl(true);
if (!match_parameter.is_null &&
!StringFunctions::set_re2_options(match_parameter, error_str,
&options)) {
- return nullptr;
+ return false;
}
- re2::RE2* re = new re2::RE2(pattern_sp, options);
+ re.reset(new re2::RE2(pattern_sp, options));
if (!re->ok()) {
std::stringstream ss;
ss << "Could not compile regexp pattern: "
<< std::string(reinterpret_cast<char*>(pattern.ptr), pattern.len)
<< std::endl
<< "Error: " << re->error();
*error_str = ss.str();
- delete re;
- return nullptr;
+ re.reset();
+ return false;
}
- return re;
+ return true;
}
} // namespace doris
diff --git a/be/src/exprs/string_functions.h b/be/src/exprs/string_functions.h
index bcdff6f80a..373686dbb6 100644
--- a/be/src/exprs/string_functions.h
+++ b/be/src/exprs/string_functions.h
@@ -38,7 +38,7 @@ public:
re2::RE2::Options* opts);
// The caller owns the returned regex. Returns nullptr if the pattern
could not be compiled.
- static re2::RE2* compile_regex(const StringVal& pattern, std::string*
error_str,
- const StringVal& match_parameter);
+ static bool compile_regex(const StringVal& pattern, std::string* error_str,
+ const StringVal& match_parameter,
std::unique_ptr<re2::RE2>& re);
};
} // namespace doris
diff --git a/be/src/olap/in_list_predicate.h b/be/src/olap/in_list_predicate.h
index 5a0990cc21..182abc25a6 100644
--- a/be/src/olap/in_list_predicate.h
+++ b/be/src/olap/in_list_predicate.h
@@ -146,7 +146,6 @@ public:
}
}
} else {
- should_delete = false;
_values = ((HybridSetType*)hybrid_set.get())->get_inner_set();
}
@@ -156,22 +155,11 @@ public:
}
~InListPredicateBase() override {
- if (should_delete) {
+ if constexpr (is_string_type(Type) || Type == TYPE_DECIMALV2 ||
is_date_type(Type)) {
delete _values;
}
}
- // Only for test
- InListPredicateBase(uint32_t column_id, phmap::flat_hash_set<T>& values,
- T min_value = type_limit<T>::min(), T max_value =
type_limit<T>::max(),
- bool is_opposite = false)
- : ColumnPredicate(column_id, is_opposite),
- _values(&values),
- _min_value(min_value),
- _max_value(max_value) {
- should_delete = false;
- }
-
PredicateType type() const override { return PT; }
Status evaluate(BitmapIndexIterator* iterator, uint32_t num_rows,
@@ -552,7 +540,6 @@ private:
}
phmap::flat_hash_set<T>* _values;
- bool should_delete = true;
mutable std::map<std::pair<RowsetId, uint32_t>,
std::vector<vectorized::UInt8>>
_segment_id_to_value_in_dict_flags;
T _min_value;
diff --git a/be/src/olap/like_column_predicate.cpp
b/be/src/olap/like_column_predicate.cpp
index cc5eb83a0b..cb5a127f82 100644
--- a/be/src/olap/like_column_predicate.cpp
+++ b/be/src/olap/like_column_predicate.cpp
@@ -27,11 +27,9 @@ template <>
LikeColumnPredicate<true>::LikeColumnPredicate(bool opposite, uint32_t
column_id,
doris_udf::FunctionContext*
fn_ctx,
doris_udf::StringVal val)
- : ColumnPredicate(column_id, opposite),
- _fn_ctx(fn_ctx),
- pattern(reinterpret_cast<char*>(val.ptr), val.len) {
+ : ColumnPredicate(column_id, opposite),
pattern(reinterpret_cast<char*>(val.ptr), val.len) {
_state = reinterpret_cast<StateType*>(
-
_fn_ctx->get_function_state(doris_udf::FunctionContext::THREAD_LOCAL));
+
fn_ctx->get_function_state(doris_udf::FunctionContext::THREAD_LOCAL));
_state->search_state.clone(_like_state);
}
@@ -39,9 +37,9 @@ template <>
LikeColumnPredicate<false>::LikeColumnPredicate(bool opposite, uint32_t
column_id,
doris_udf::FunctionContext*
fn_ctx,
doris_udf::StringVal val)
- : ColumnPredicate(column_id, opposite), _fn_ctx(fn_ctx), pattern(val) {
+ : ColumnPredicate(column_id, opposite), pattern(val) {
_state = reinterpret_cast<StateType*>(
-
_fn_ctx->get_function_state(doris_udf::FunctionContext::THREAD_LOCAL));
+
fn_ctx->get_function_state(doris_udf::FunctionContext::THREAD_LOCAL));
}
template <bool is_vectorized>
diff --git a/be/src/olap/like_column_predicate.h
b/be/src/olap/like_column_predicate.h
index d5d964b6c3..a38f9228fb 100644
--- a/be/src/olap/like_column_predicate.h
+++ b/be/src/olap/like_column_predicate.h
@@ -143,7 +143,6 @@ private:
std::string _origin;
// lifetime controlled by scan node
- doris_udf::FunctionContext* _fn_ctx;
using PatternType = std::conditional_t<is_vectorized, StringRef,
StringVal>;
using StateType = vectorized::LikeState;
PatternType pattern;
diff --git a/be/src/udf/udf.cpp b/be/src/udf/udf.cpp
index cf7345122f..785b2c7db0 100644
--- a/be/src/udf/udf.cpp
+++ b/be/src/udf/udf.cpp
@@ -310,14 +310,14 @@ void FunctionContext::free(int64_t bytes) {
_impl->_external_bytes_tracked -= bytes;
}
-void FunctionContext::set_function_state(FunctionStateScope scope, void* ptr) {
+void FunctionContext::set_function_state(FunctionStateScope scope,
std::shared_ptr<void> ptr) {
assert(!_impl->_closed);
switch (scope) {
case THREAD_LOCAL:
- _impl->_thread_local_fn_state = ptr;
+ _impl->_thread_local_fn_state = std::move(ptr);
break;
case FRAGMENT_LOCAL:
- _impl->_fragment_local_fn_state = ptr;
+ _impl->_fragment_local_fn_state = std::move(ptr);
break;
default:
std::stringstream ss;
@@ -475,9 +475,9 @@ void*
FunctionContext::get_function_state(FunctionStateScope scope) const {
// assert(!_impl->_closed);
switch (scope) {
case THREAD_LOCAL:
- return _impl->_thread_local_fn_state;
+ return _impl->_thread_local_fn_state.get();
case FRAGMENT_LOCAL:
- return _impl->_fragment_local_fn_state;
+ return _impl->_fragment_local_fn_state.get();
default:
// TODO: signal error somehow
return nullptr;
diff --git a/be/src/udf/udf.h b/be/src/udf/udf.h
index 88b06c5bc1..b57e930e36 100644
--- a/be/src/udf/udf.h
+++ b/be/src/udf/udf.h
@@ -25,6 +25,7 @@
#include <cstdint>
#include <functional>
#include <iostream>
+#include <memory>
#include <vector>
// This is the only Doris header required to develop UDFs and UDAs. This header
@@ -215,7 +216,7 @@ public:
/// GetFunctionState() is called when no pointer is set, it will return
/// nullptr. SetFunctionState() does not take ownership of 'ptr'; it is up
to the UDF/UDA
/// to clean up any function state if necessary.
- void set_function_state(FunctionStateScope scope, void* ptr);
+ void set_function_state(FunctionStateScope scope, std::shared_ptr<void>
ptr);
void* get_function_state(FunctionStateScope scope) const;
diff --git a/be/src/udf/udf_internal.h b/be/src/udf/udf_internal.h
index 41407a4220..ab786a6954 100644
--- a/be/src/udf/udf_internal.h
+++ b/be/src/udf/udf_internal.h
@@ -152,8 +152,8 @@ private:
std::vector<uint8_t*> _local_allocations;
/// The function state accessed via FunctionContext::Get/SetFunctionState()
- void* _thread_local_fn_state;
- void* _fragment_local_fn_state;
+ std::shared_ptr<void> _thread_local_fn_state;
+ std::shared_ptr<void> _fragment_local_fn_state;
// The number of bytes allocated externally by the user function. In some
cases,
// it is too inconvenient to use the Allocate()/Free() APIs in the
FunctionContext,
diff --git a/be/src/vec/functions/function_convert_tz.h
b/be/src/vec/functions/function_convert_tz.h
index b4a222ef6f..caf704cde9 100644
--- a/be/src/vec/functions/function_convert_tz.h
+++ b/be/src/vec/functions/function_convert_tz.h
@@ -140,17 +140,11 @@ public:
if (scope != FunctionContext::THREAD_LOCAL) {
return Status::OK();
}
- context->set_function_state(scope, new ConvertTzCtx);
+ context->set_function_state(scope, std::make_shared<ConvertTzCtx>());
return Status::OK();
}
Status close(FunctionContext* context, FunctionContext::FunctionStateScope
scope) override {
- if (scope == FunctionContext::THREAD_LOCAL) {
- auto* convert_ctx = reinterpret_cast<ConvertTzCtx*>(
-
context->get_function_state(FunctionContext::THREAD_LOCAL));
- delete convert_ctx;
- context->set_function_state(FunctionContext::THREAD_LOCAL,
nullptr);
- }
return Status::OK();
}
diff --git a/be/src/vec/functions/function_java_udf.cpp
b/be/src/vec/functions/function_java_udf.cpp
index abffb8d8bc..0a031e186f 100644
--- a/be/src/vec/functions/function_java_udf.cpp
+++ b/be/src/vec/functions/function_java_udf.cpp
@@ -64,7 +64,8 @@ Status JavaFunctionCall::prepare(FunctionContext* context,
executor_close_id_ = env->GetMethodID(executor_cl_, "close",
EXECUTOR_CLOSE_SIGNATURE);
RETURN_ERROR_IF_EXC(env);
- JniContext* jni_ctx = new JniContext(_argument_types.size(), this);
+ std::shared_ptr<JniContext> jni_ctx =
+ std::make_shared<JniContext>(_argument_types.size(), this);
context->set_function_state(FunctionContext::THREAD_LOCAL, jni_ctx);
// Add a scoped cleanup jni reference object. This cleans up local refs
made below.
@@ -308,10 +309,9 @@ Status JavaFunctionCall::close(FunctionContext* context,
FunctionContext::FunctionStateScope scope) {
JniContext* jni_ctx = reinterpret_cast<JniContext*>(
context->get_function_state(FunctionContext::THREAD_LOCAL));
- if (jni_ctx != nullptr) {
- delete jni_ctx;
- context->set_function_state(FunctionContext::THREAD_LOCAL, nullptr);
- }
+ // JNIContext own some resource and its release method depend on
JavaFunctionCall
+ // has to release the resource before JavaFunctionCall is deconstructed.
+ jni_ctx->close();
return Status::OK();
}
} // namespace doris::vectorized
diff --git a/be/src/vec/functions/function_java_udf.h
b/be/src/vec/functions/function_java_udf.h
index 7ffa456d82..ad3335b384 100644
--- a/be/src/vec/functions/function_java_udf.h
+++ b/be/src/vec/functions/function_java_udf.h
@@ -85,6 +85,7 @@ private:
JavaFunctionCall* parent = nullptr;
jobject executor = nullptr;
+ bool is_closed = false;
std::unique_ptr<int64_t[]> input_values_buffer_ptr;
std::unique_ptr<int64_t[]> input_nulls_buffer_ptr;
@@ -119,16 +120,23 @@ private:
batch_size_ptr(new int32_t()),
output_intermediate_state_ptr(new IntermediateState()) {}
- ~JniContext() {
+ void close() {
+ if (is_closed) {
+ return;
+ }
VLOG_DEBUG << "Free resources for JniContext";
JNIEnv* env;
- Status status;
- RETURN_IF_STATUS_ERROR(status, JniUtil::GetJNIEnv(&env));
+ Status status = JniUtil::GetJNIEnv(&env);
+ if (!status.ok()) {
+ LOG(WARNING) << "errors while get jni env " << status;
+ return;
+ }
env->CallNonvirtualVoidMethodA(executor, parent->executor_cl_,
parent->executor_close_id_, NULL);
Status s = JniUtil::GetJniExceptionMsg(env);
if (!s.ok()) LOG(WARNING) << s;
env->DeleteGlobalRef(executor);
+ is_closed = true;
}
/// These functions are cross-compiled to IR and used by codegen.
diff --git a/be/src/vec/functions/function_regexp.cpp
b/be/src/vec/functions/function_regexp.cpp
index 7bfe48c765..7ff07b9f09 100644
--- a/be/src/vec/functions/function_regexp.cpp
+++ b/be/src/vec/functions/function_regexp.cpp
@@ -51,13 +51,14 @@ struct RegexpReplaceImpl {
if (re == nullptr) {
std::string error_str;
const auto& pattern =
pattern_col->get_data_at(i).to_string_val();
- re = StringFunctions::compile_regex(pattern, &error_str,
StringVal::null());
- if (re == nullptr) {
+ bool st = StringFunctions::compile_regex(pattern, &error_str,
StringVal::null(),
+ scoped_re);
+ if (!st) {
context->add_warning(error_str.c_str());
StringOP::push_null_string(i, result_data, result_offset,
null_map);
continue;
}
- scoped_re.reset(re);
+ re = scoped_re.get();
}
re2::StringPiece replace_str =
@@ -94,13 +95,14 @@ struct RegexpReplaceOneImpl {
if (re == nullptr) {
std::string error_str;
const auto& pattern =
pattern_col->get_data_at(i).to_string_val();
- re = StringFunctions::compile_regex(pattern, &error_str,
StringVal::null());
- if (re == nullptr) {
+ bool st = StringFunctions::compile_regex(pattern, &error_str,
StringVal::null(),
+ scoped_re);
+ if (!st) {
context->add_warning(error_str.c_str());
StringOP::push_null_string(i, result_data, result_offset,
null_map);
continue;
}
- scoped_re.reset(re);
+ re = scoped_re.get();
}
re2::StringPiece replace_str =
@@ -142,13 +144,14 @@ struct RegexpExtractImpl {
if (re == nullptr) {
std::string error_str;
const auto& pattern =
pattern_col->get_data_at(i).to_string_val();
- re = StringFunctions::compile_regex(pattern, &error_str,
StringVal::null());
- if (re == nullptr) {
+ bool st = StringFunctions::compile_regex(pattern, &error_str,
StringVal::null(),
+ scoped_re);
+ if (!st) {
context->add_warning(error_str.c_str());
StringOP::push_null_string(i, result_data, result_offset,
null_map);
continue;
}
- scoped_re.reset(re);
+ re = scoped_re.get();
}
const auto& str = str_col->get_data_at(i);
re2::StringPiece str_sp = re2::StringPiece(str.data, str.size);
@@ -196,13 +199,14 @@ struct RegexpExtractAllImpl {
if (re == nullptr) {
std::string error_str;
const auto& pattern =
pattern_col->get_data_at(i).to_string_val();
- re = StringFunctions::compile_regex(pattern, &error_str,
StringVal::null());
- if (re == nullptr) {
+ bool st = StringFunctions::compile_regex(pattern, &error_str,
StringVal::null(),
+ scoped_re);
+ if (!st) {
context->add_warning(error_str.c_str());
StringOP::push_null_string(i, result_data, result_offset,
null_map);
continue;
}
- scoped_re.reset(re);
+ re = scoped_re.get();
}
if (re->NumberOfCapturingGroups() == 0) {
StringOP::push_empty_string(i, result_data, result_offset);
@@ -282,12 +286,14 @@ public:
}
std::string error_str;
- re2::RE2* re =
- StringFunctions::compile_regex(pattern, &error_str,
StringVal::null());
- if (re == nullptr) {
+ std::unique_ptr<re2::RE2> scoped_re;
+ bool st = StringFunctions::compile_regex(pattern, &error_str,
StringVal::null(),
+ scoped_re);
+ if (!st) {
context->set_error(error_str.c_str());
return Status::InvalidArgument(error_str);
}
+ std::shared_ptr<re2::RE2> re(scoped_re.release());
context->set_function_state(scope, re);
}
}
@@ -324,14 +330,6 @@ public:
}
Status close(FunctionContext* context, FunctionContext::FunctionStateScope
scope) override {
- if (scope == FunctionContext::THREAD_LOCAL) {
- if (context->is_col_constant(1)) {
- re2::RE2* re =
reinterpret_cast<re2::RE2*>(context->get_function_state(scope));
- DCHECK(re);
- delete re;
- context->set_function_state(scope, nullptr);
- }
- }
return Status::OK();
}
};
diff --git a/be/src/vec/functions/function_string.h
b/be/src/vec/functions/function_string.h
index 2e3eacf031..d230c9a60c 100644
--- a/be/src/vec/functions/function_string.h
+++ b/be/src/vec/functions/function_string.h
@@ -2473,6 +2473,14 @@ struct SubReplaceFourImpl {
}
};
+// Wrap iconv_open and iconv_close to a shared ptr call
+class IconvWrapper {
+public:
+ iconv_t cd_;
+ IconvWrapper(iconv_t cd) : cd_(cd) {}
+ ~IconvWrapper() { iconv_close(cd_); }
+};
+
class FunctionConvertTo : public IFunction {
public:
static constexpr auto name = "convert_to";
@@ -2504,7 +2512,9 @@ public:
return Status::RuntimeError("function {} is convert to gbk
failed in iconv_open",
get_name());
}
- context->set_function_state(scope, cd);
+ // IconvWrapper will call iconv_close during deconstructor
+ std::shared_ptr<IconvWrapper> cd_wrapper =
std::make_shared<IconvWrapper>(cd);
+ context->set_function_state(scope, cd_wrapper);
} else {
return Status::RuntimeError(
"Illegal second argument column of function convert. now
only support "
@@ -2525,8 +2535,9 @@ public:
auto& res_offset = col_res->get_offsets();
auto& res_chars = col_res->get_chars();
res_offset.resize(input_rows_count);
- iconv_t cd = reinterpret_cast<iconv_t>(
- context->get_function_state(FunctionContext::THREAD_LOCAL));
+ iconv_t cd = reinterpret_cast<IconvWrapper*>(
+
context->get_function_state(FunctionContext::THREAD_LOCAL))
+ ->cd_;
DCHECK(cd != nullptr);
size_t in_len = 0, out_len = 0;
@@ -2549,12 +2560,6 @@ public:
}
Status close(FunctionContext* context, FunctionContext::FunctionStateScope
scope) override {
- if (scope == FunctionContext::THREAD_LOCAL) {
- iconv_t cd = reinterpret_cast<iconv_t>(
-
context->get_function_state(FunctionContext::THREAD_LOCAL));
- iconv_close(cd);
- context->set_function_state(FunctionContext::THREAD_LOCAL,
nullptr);
- }
return Status::OK();
}
};
diff --git a/be/src/vec/functions/functions_geo.cpp
b/be/src/vec/functions/functions_geo.cpp
index cff645de6b..f51715c19d 100644
--- a/be/src/vec/functions/functions_geo.cpp
+++ b/be/src/vec/functions/functions_geo.cpp
@@ -273,7 +273,7 @@ struct StCircle {
return Status::OK();
}
- auto state = new StConstructState();
+ std::shared_ptr<StConstructState> state =
std::make_shared<StConstructState>();
DoubleVal* lng =
reinterpret_cast<DoubleVal*>(context->get_constant_arg(0));
DoubleVal* lat =
reinterpret_cast<DoubleVal*>(context->get_constant_arg(1));
DoubleVal* radius =
reinterpret_cast<DoubleVal*>(context->get_constant_arg(2));
@@ -295,12 +295,6 @@ struct StCircle {
}
static Status close(FunctionContext* context,
FunctionContext::FunctionStateScope scope) {
- if (scope != FunctionContext::FRAGMENT_LOCAL) {
- return Status::OK();
- }
- StConstructState* state =
-
reinterpret_cast<StConstructState*>(context->get_function_state(scope));
- delete state;
return Status::OK();
}
};
@@ -365,7 +359,7 @@ struct StContains {
return Status::OK();
}
- auto contains_ctx = new StContainsState();
+ std::shared_ptr<StContainsState> contains_ctx =
std::make_shared<StContainsState>();
for (int i = 0; !contains_ctx->is_null && i < 2; ++i) {
if (context->is_arg_constant(i)) {
StringVal* str =
reinterpret_cast<StringVal*>(context->get_constant_arg(i));
@@ -386,12 +380,6 @@ struct StContains {
}
static Status close(FunctionContext* context,
FunctionContext::FunctionStateScope scope) {
- if (scope != FunctionContext::FRAGMENT_LOCAL) {
- return Status::OK();
- }
- StContainsState* state =
-
reinterpret_cast<StContainsState*>(context->get_function_state(scope));
- delete state;
return Status::OK();
}
};
@@ -486,7 +474,7 @@ struct StGeoFromText {
return Status::OK();
}
- auto state = new StConstructState();
+ std::shared_ptr<StConstructState> state =
std::make_shared<StConstructState>();
auto str_value =
reinterpret_cast<StringVal*>(context->get_constant_arg(0));
if (str_value->is_null) {
state->is_null = true;
@@ -507,11 +495,6 @@ struct StGeoFromText {
}
static Status close(FunctionContext* context,
FunctionContext::FunctionStateScope scope) {
- if (scope == FunctionContext::FRAGMENT_LOCAL) {
- StConstructState* state =
-
reinterpret_cast<StConstructState*>(context->get_function_state(scope));
- delete state;
- }
return Status::OK();
}
};
diff --git a/be/src/vec/functions/in.h b/be/src/vec/functions/in.h
index b5f3364ae7..97e299bdef 100644
--- a/be/src/vec/functions/in.h
+++ b/be/src/vec/functions/in.h
@@ -66,7 +66,7 @@ public:
if (scope == FunctionContext::THREAD_LOCAL) {
return Status::OK();
}
- auto* state = new InState();
+ std::shared_ptr<InState> state = std::make_shared<InState>();
context->set_function_state(scope, state);
if (context->get_arg_type(0)->type == FunctionContext::Type::TYPE_CHAR
||
context->get_arg_type(0)->type ==
FunctionContext::Type::TYPE_VARCHAR ||
@@ -223,10 +223,6 @@ public:
}
Status close(FunctionContext* context, FunctionContext::FunctionStateScope
scope) override {
- if (scope == FunctionContext::FRAGMENT_LOCAL) {
- delete reinterpret_cast<InState*>(
-
context->get_function_state(FunctionContext::FRAGMENT_LOCAL));
- }
return Status::OK();
}
};
diff --git a/be/src/vec/functions/like.cpp b/be/src/vec/functions/like.cpp
index e8b0ad6321..84e8600008 100644
--- a/be/src/vec/functions/like.cpp
+++ b/be/src/vec/functions/like.cpp
@@ -391,11 +391,6 @@ Status FunctionLikeBase::execute_impl(FunctionContext*
context, Block& block,
Status FunctionLikeBase::close(FunctionContext* context,
FunctionContext::FunctionStateScope scope) {
- if (scope == FunctionContext::THREAD_LOCAL) {
- auto* state = reinterpret_cast<LikeState*>(
- context->get_function_state(FunctionContext::THREAD_LOCAL));
- delete state;
- }
return Status::OK();
}
@@ -540,7 +535,7 @@ Status FunctionLike::prepare(FunctionContext* context,
FunctionContext::Function
if (scope != FunctionContext::THREAD_LOCAL) {
return Status::OK();
}
- auto* state = new LikeState();
+ std::shared_ptr<LikeState> state = std::make_shared<LikeState>();
context->set_function_state(scope, state);
state->function = like_fn;
state->predicate_like_function = like_fn_predicate;
@@ -600,7 +595,7 @@ Status FunctionRegexp::prepare(FunctionContext* context,
if (scope != FunctionContext::THREAD_LOCAL) {
return Status::OK();
}
- auto* state = new LikeState();
+ std::shared_ptr<LikeState> state = std::make_shared<LikeState>();
context->set_function_state(scope, state);
state->function = regexp_fn;
state->predicate_like_function = regexp_fn_predicate;
diff --git a/be/src/vec/functions/random.cpp b/be/src/vec/functions/random.cpp
index 7ae38b4b29..976b4340a8 100644
--- a/be/src/vec/functions/random.cpp
+++ b/be/src/vec/functions/random.cpp
@@ -41,14 +41,8 @@ public:
}
Status prepare(FunctionContext* context,
FunctionContext::FunctionStateScope scope) override {
- std::mt19937_64* generator =
-
reinterpret_cast<std::mt19937_64*>(context->allocate(sizeof(std::mt19937_64)));
- if (UNLIKELY(generator == nullptr)) {
- return Status::MemoryAllocFailed("allocate random seed generator
failed.");
- }
-
+ std::shared_ptr<std::mt19937_64> generator(new std::mt19937_64());
context->set_function_state(scope, generator);
- new (generator) std::mt19937_64();
if (scope == FunctionContext::THREAD_LOCAL) {
if (context->get_num_args() == 1) {
// This is a call to RandSeed, initialize the seed
@@ -90,12 +84,6 @@ public:
}
Status close(FunctionContext* context, FunctionContext::FunctionStateScope
scope) override {
- if (scope == FunctionContext::THREAD_LOCAL) {
- uint8_t* generator = reinterpret_cast<uint8_t*>(
-
context->get_function_state(FunctionContext::THREAD_LOCAL));
- context->free(generator);
- context->set_function_state(FunctionContext::THREAD_LOCAL,
nullptr);
- }
return Status::OK();
}
};
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]