From 63fb74b480978d4db9a16f74b5da0ccf3e39560a Mon Sep 17 00:00:00 2001 From: zhangstar333 Date: Fri, 28 Mar 2025 09:57:18 +0800 Subject: [PATCH] branch-2.1: [Bug](udf) should delete local ref when return error msg #48609 (#49528) Problem Summary: cherry-pick from master (#48609) --- .../aggregate_function_java_udaf.h | 13 ++++--------- be/src/vec/functions/function_java_udf.cpp | 3 +-- 2 files changed, 5 insertions(+), 11 deletions(-) diff --git a/be/src/vec/aggregate_functions/aggregate_function_java_udaf.h b/be/src/vec/aggregate_functions/aggregate_function_java_udaf.h index 44f1889efd..7740c809de 100644 --- a/be/src/vec/aggregate_functions/aggregate_function_java_udaf.h +++ b/be/src/vec/aggregate_functions/aggregate_function_java_udaf.h @@ -203,9 +203,8 @@ public: jobject output_map = JniUtil::convert_to_java_map(env, output_params); long output_address = env->CallLongMethod(executor_obj, executor_get_value_id, place, output_map); - RETURN_IF_ERROR(JniUtil::GetJniExceptionMsg(env)); env->DeleteLocalRef(output_map); - + RETURN_IF_ERROR(JniUtil::GetJniExceptionMsg(env)); return JniConnector::fill_block(&output_block, {0}, output_address); } @@ -288,16 +287,12 @@ public: void create(AggregateDataPtr __restrict place) const override { new (place) Data(argument_types.size()); if (_first_created) { - Status status = Status::OK(); - SAFE_CREATE(RETURN_IF_STATUS_ERROR(status, - this->data(place).init_udaf(_fn, _local_location)), - { - static_cast(this->data(place).destroy()); - this->data(place).~Data(); - }); + Status status = this->data(place).init_udaf(_fn, _local_location); _first_created = false; _exec_place = place; if (UNLIKELY(!status.ok())) { + static_cast(this->data(place).destroy()); + this->data(place).~Data(); throw doris::Exception(ErrorCode::INTERNAL_ERROR, status.to_string()); } } diff --git a/be/src/vec/functions/function_java_udf.cpp b/be/src/vec/functions/function_java_udf.cpp index 63985f1964..cff050794f 100644 --- a/be/src/vec/functions/function_java_udf.cpp +++ b/be/src/vec/functions/function_java_udf.cpp @@ -114,10 +114,9 @@ Status JavaFunctionCall::execute_impl(FunctionContext* context, Block& block, jobject output_map = JniUtil::convert_to_java_map(env, output_params); long output_address = env->CallLongMethod(jni_ctx->executor, jni_ctx->executor_evaluate_id, input_map, output_map); - RETURN_IF_ERROR(JniUtil::GetJniExceptionMsg(env)); env->DeleteLocalRef(input_map); env->DeleteLocalRef(output_map); - + RETURN_IF_ERROR(JniUtil::GetJniExceptionMsg(env)); return JniConnector::fill_block(&block, {result}, output_address); }