From 0d6dc4e2caa43bdbddb243a2162b43ba932c9804 Mon Sep 17 00:00:00 2001 From: obdev Date: Wed, 19 Apr 2023 07:11:50 +0000 Subject: [PATCH] issue<48107888>:fix memory leak of inner store routine with out argument --- src/pl/ob_pl.cpp | 2 ++ src/pl/ob_pl_code_generator.cpp | 21 +++++++++++++++++++++ src/pl/ob_pl_code_generator.h | 1 + src/sql/ob_spi.cpp | 17 +++++++++++++++++ src/sql/ob_spi.h | 3 +++ 5 files changed, 44 insertions(+) diff --git a/src/pl/ob_pl.cpp b/src/pl/ob_pl.cpp index 75fcc7b36c..25ba261bf6 100644 --- a/src/pl/ob_pl.cpp +++ b/src/pl/ob_pl.cpp @@ -104,6 +104,8 @@ int ObPL::init(common::ObMySQLProxy &sql_proxy) (void*)(sql::ObSPIService::spi_reset_collection)); jit::ObLLVMHelper::add_symbol(ObString("spi_copy_datum"), (void*)(sql::ObSPIService::spi_copy_datum)); + jit::ObLLVMHelper::add_symbol(ObString("spi_destruct_obj"), + (void*)(sql::ObSPIService::spi_destruct_obj)); jit::ObLLVMHelper::add_symbol(ObString("spi_sub_nestedtable"), (void*)(sql::ObSPIService::spi_sub_nestedtable)); jit::ObLLVMHelper::add_symbol(ObString("spi_alloc_complex_var"), diff --git a/src/pl/ob_pl_code_generator.cpp b/src/pl/ob_pl_code_generator.cpp index b40de62abc..3fd00ca6bc 100644 --- a/src/pl/ob_pl_code_generator.cpp +++ b/src/pl/ob_pl_code_generator.cpp @@ -3743,6 +3743,13 @@ int ObPLCodeGenerator::init_spi_service() OZ (ObLLVMFunctionType::get(int32_type, arg_types, ft)); OZ (helper_.create_function(ObString("spi_copy_datum"), ft, spi_service_.spi_copy_datum_)); } + if (OB_SUCC(ret)) { + arg_types.reset(); + OZ (arg_types.push_back(pl_exec_context_pointer_type)); //函数第一个参数必须是基础环境信息隐藏参数 + OZ (arg_types.push_back(obj_pointer_type)); //src + OZ (ObLLVMFunctionType::get(int32_type, arg_types, ft)); + OZ (helper_.create_function(ObString("spi_destruct_obj"), ft, spi_service_.spi_destruct_obj_)); + } if (OB_SUCC(ret)) { arg_types.reset(); @@ -7648,6 +7655,20 @@ int ObPLCodeGenerator::generate_out_param( s.get_block()->in_notfound(), s.get_block()->in_warning(), OB_INVALID_ID)); + if (OB_SUCC(ret) && PL_CALL == s.get_type()) { + ObSEArray args; + + OZ (args.push_back(get_vars()[CTX_IDX])); + OZ (args.push_back(src_datum)); + if (OB_SUCC(ret)) { + jit::ObLLVMValue ret_err; + if (OB_FAIL(get_helper().create_call(ObString("spi_destruct_obj"), get_spi_service().spi_destruct_obj_, args, ret_err))) { + LOG_WARN("failed to create call", K(ret)); + } else if (OB_FAIL(check_success(ret_err, s.get_stmt_id(), s.get_block()->in_notfound(), s.get_block()->in_warning()))) { + LOG_WARN("failed to check success", K(ret)); + } else { /*do nothing*/ } + } + } } } else { //处理基础类型的出参 ObSEArray args; diff --git a/src/pl/ob_pl_code_generator.h b/src/pl/ob_pl_code_generator.h index e0282e870b..2aac45dd9b 100644 --- a/src/pl/ob_pl_code_generator.h +++ b/src/pl/ob_pl_code_generator.h @@ -77,6 +77,7 @@ public: jit::ObLLVMFunction spi_init_collection_; jit::ObLLVMFunction spi_reset_collection_; jit::ObLLVMFunction spi_copy_datum_; + jit::ObLLVMFunction spi_destruct_obj_; jit::ObLLVMFunction spi_sub_nestedtable_; jit::ObLLVMFunction spi_alloc_complex_var_; jit::ObLLVMFunction spi_construct_collection_; diff --git a/src/sql/ob_spi.cpp b/src/sql/ob_spi.cpp index 87840ccb1b..ab2969a327 100644 --- a/src/sql/ob_spi.cpp +++ b/src/sql/ob_spi.cpp @@ -4806,6 +4806,23 @@ int ObSPIService::spi_copy_datum(ObPLExecCtx *ctx, return ret; } +int ObSPIService::spi_destruct_obj(ObPLExecCtx *ctx, + ObObj *obj) +{ + int ret = OB_SUCCESS; + CK (OB_NOT_NULL(ctx)); + CK (OB_NOT_NULL(ctx->exec_ctx_)); + CK (OB_NOT_NULL(obj)); + if (OB_SUCC(ret) && + obj->is_pl_extend() && + obj->get_meta().get_extend_type() != pl::PL_REF_CURSOR_TYPE) { + OZ (ObUserDefinedType::destruct_obj(*obj, ctx->exec_ctx_->get_my_session())); + } + + SET_SPI_STATUS; + return ret; +} + int ObSPIService::spi_interface_impl(pl::ObPLExecCtx* ctx, int64_t func_addr) { int ret = OB_SUCCESS; diff --git a/src/sql/ob_spi.h b/src/sql/ob_spi.h index e7e6513aa1..8efc962593 100644 --- a/src/sql/ob_spi.h +++ b/src/sql/ob_spi.h @@ -549,6 +549,9 @@ public: ObDataType *dest_type, uint64_t package_id = OB_INVALID_ID); + static int spi_destruct_obj(pl::ObPLExecCtx *ctx, + ObObj *obj); + static int spi_build_record_type(common::ObIAllocator &allocator, ObSQLSessionInfo &session, share::schema::ObSchemaGetterGuard &schema_guard,