diff --git a/src/sql/ob_spi.cpp b/src/sql/ob_spi.cpp index aadbc5509f..af5157b310 100644 --- a/src/sql/ob_spi.cpp +++ b/src/sql/ob_spi.cpp @@ -7520,14 +7520,14 @@ int ObSPIService::store_result(ObPLExecCtx *ctx, for (int64_t i = 0; OB_SUCC(ret) && i < calc_array->count(); ++i) { ObObj tmp; if (calc_array->at(i).is_pl_extend()) { - pl::ObUserDefinedType::deep_copy_obj(*alloc, calc_array->at(i), tmp); + OZ (pl::ObUserDefinedType::deep_copy_obj(*alloc, calc_array->at(i), tmp)); } else { OZ (ob_write_obj(*alloc, calc_array->at(i), tmp)); } OX (calc_array->at(i) = tmp); } } - OZ (store_datums(result_address, *calc_array, alloc, is_schema_object)); + OZ (store_datums(result_address, *calc_array, alloc, ctx->exec_ctx_->get_my_session(), is_schema_object)); } } else if (is_question_mark_expression(*result_expr)) { //通过question mark访问得到的基础变量 int64_t param_idx = get_const_value(*result_expr).get_unknown(); @@ -7783,8 +7783,11 @@ int ObSPIService::store_result(ObPLExecCtx *ctx, return ret; } -int ObSPIService::store_datums(ObObj &dest_addr, const ObIArray &obj_array, - ObIAllocator *alloc, bool is_schema_object) +int ObSPIService::store_datums(ObObj &dest_addr, + ObIArray &obj_array, + ObIAllocator *alloc, + ObSQLSessionInfo *session_info, + bool is_schema_object) { int ret = OB_SUCCESS; if (obj_array.empty() || OB_ISNULL(alloc)) { @@ -7850,6 +7853,15 @@ int ObSPIService::store_datums(ObObj &dest_addr, const ObIArray &obj_arra OX (current_datum = reinterpret_cast(dest_addr.get_ext())); } + if (OB_FAIL(ret)) { + for (int64_t i = 0; i < obj_array.count(); ++i) { + int tmp_ret = OB_SUCCESS; + if ((tmp_ret = ObUserDefinedType::destruct_obj(obj_array.at(i), session_info)) != OB_SUCCESS) { + LOG_WARN("failed to destruct obj, memory may leak", K(ret), K(tmp_ret), K(i), K(obj_array)); + } + } + } + for (int64_t i = 0; OB_SUCC(ret) && !is_opaque && i < obj_array.count(); ++i) { if (OB_FAIL(store_datum(current_datum, obj_array.at(i)))) { LOG_WARN("failed to arrange store", K(dest_addr), K(i), K(obj_array.at(i)), K(obj_array), K(ret)); diff --git a/src/sql/ob_spi.h b/src/sql/ob_spi.h index 53748e4af4..015bb9aca2 100644 --- a/src/sql/ob_spi.h +++ b/src/sql/ob_spi.h @@ -973,8 +973,8 @@ private: ObIArray &row_desc, bool is_type_record); - static int store_datums(ObObj &dest_addr, const ObIArray &result, - ObIAllocator *alloc, bool is_schema_object); + static int store_datums(ObObj &dest_addr, ObIArray &result, + ObIAllocator *alloc, ObSQLSessionInfo *session_info, bool is_schema_object); static int store_datum(int64_t ¤t_addr, const ObObj &obj);