From ff037236da49b42873e666cf996b201e9c6afb9a Mon Sep 17 00:00:00 2001 From: obdev Date: Tue, 7 Feb 2023 16:18:09 +0800 Subject: [PATCH] [to #47311946] fix memory leak of composite assign --- src/pl/ob_pl_allocator.cpp | 30 +----------------------------- src/pl/ob_pl_package_state.cpp | 15 ++++++++------- 2 files changed, 9 insertions(+), 36 deletions(-) diff --git a/src/pl/ob_pl_allocator.cpp b/src/pl/ob_pl_allocator.cpp index 9d511de4b6..a78a024218 100644 --- a/src/pl/ob_pl_allocator.cpp +++ b/src/pl/ob_pl_allocator.cpp @@ -126,35 +126,7 @@ int ObPLPkgAllocator::copy_all_element_with_new_allocator(ObIAllocator *allocato if (vars.at(i).is_pl_extend() && vars.at(i).get_meta().get_extend_type() != PL_CURSOR_TYPE) { OZ (pl::ObUserDefinedType::deep_copy_obj(*allocator, vars.at(i), dst, true)); - if (OB_SUCC(ret)) { - switch (vars.at(i).get_meta().get_extend_type()) { - case PL_NESTED_TABLE_TYPE: - case PL_ASSOCIATIVE_ARRAY_TYPE: - case PL_VARRAY_TYPE: { - ObPLCollection *coll = reinterpret_cast(vars.at(i).get_ext()); - if (OB_NOT_NULL(coll) && OB_NOT_NULL(coll->get_allocator())) { - if (NULL == dynamic_cast(coll->get_allocator())) { - ret = OB_ERR_UNEXPECTED; - LOG_ERROR("here must be a bug"); - } else { - coll->get_allocator()->reset(); - } - coll->set_data(NULL); - coll->set_count(0); - coll->set_first(OB_INVALID_INDEX); - coll->set_last(OB_INVALID_INDEX); - } - break; - } - case PL_RECORD_TYPE: - case PL_OPAQUE_TYPE: - break; - default: - ret = OB_ERR_UNEXPECTED; - LOG_WARN("wrong extend type!", K(ret), K(vars.at(i).get_meta().get_extend_type())); - break; - } - } + OZ (pl::ObUserDefinedType::destruct_obj(vars.at(i), nullptr)); } else { OZ (deep_copy_obj(*allocator, vars.at(i), dst)); } diff --git a/src/pl/ob_pl_package_state.cpp b/src/pl/ob_pl_package_state.cpp index f00a4a70e4..3615633769 100644 --- a/src/pl/ob_pl_package_state.cpp +++ b/src/pl/ob_pl_package_state.cpp @@ -162,13 +162,14 @@ void ObPLPackageState::reset(ObSQLSessionInfo *session_info) changed_vars_.reset(); for (int64_t i = 0; i < types_.count(); ++i) { if (!vars_.at(i).is_ext()) { - } else if (PL_NESTED_TABLE_TYPE == types_.at(i) - || PL_ASSOCIATIVE_ARRAY_TYPE == types_.at(i) - || PL_VARRAY_TYPE == types_.at(i)) { - ObPLCollection *coll = reinterpret_cast(vars_.at(i).get_ext()); - if (OB_NOT_NULL(coll) - && OB_NOT_NULL(dynamic_cast(coll->get_allocator()))) { - coll->get_allocator()->reset(); + } else if (PL_RECORD_TYPE == types_.at(i) + || PL_NESTED_TABLE_TYPE == types_.at(i) + || PL_ASSOCIATIVE_ARRAY_TYPE == types_.at(i) + || PL_VARRAY_TYPE == types_.at(i) + || PL_OPAQUE_TYPE == types_.at(i)) { + int ret = OB_SUCCESS; + if (OB_FAIL(ObUserDefinedType::destruct_obj(vars_.at(i), session_info))) { + LOG_WARN("failed to destruct composte obj", K(ret)); } } else if (PL_CURSOR_TYPE == types_.at(i)) { ObPLCursorInfo *cursor = reinterpret_cast(vars_.at(i).get_ext());