diff --git a/src/pl/ob_pl_package_manager.cpp b/src/pl/ob_pl_package_manager.cpp index f23421e502..c694b42ccb 100644 --- a/src/pl/ob_pl_package_manager.cpp +++ b/src/pl/ob_pl_package_manager.cpp @@ -758,14 +758,16 @@ int ObPLPackageManager::set_package_var_val(const ObPLResolveCtx &resolve_ctx, LOG_WARN("not null check violated", K(var->is_not_null()), K(var_val.is_null()), K(ret)); } OZ (package_state->set_package_var_val(var_idx, new_var_val, !need_deserialize)); + if (OB_NOT_NULL(var) && var->get_type().is_cursor_type() && !var->get_type().is_cursor_var()) { + // package ref cursor variable, refrence outside, do not destruct it. + } else if (OB_FAIL(ret)) { + OZ (ObUserDefinedType::destruct_obj(new_var_val, &(resolve_ctx.session_info_))); + } else { + OZ (ObUserDefinedType::destruct_obj(old_var_val, &(resolve_ctx.session_info_))); + } if (!need_deserialize) { OZ (package_state->update_changed_vars(var_idx)); } - OZ (var->get_type().free_session_var(resolve_ctx, - var->get_type().is_cursor_type() ? - package_state->get_pkg_cursor_allocator() - : package_state->get_pkg_allocator(), - old_var_val), K(package_id), K(var_idx), K(var_val)); return ret; } diff --git a/src/sql/ob_spi.cpp b/src/sql/ob_spi.cpp index f791195c93..b7e5e25edb 100644 --- a/src/sql/ob_spi.cpp +++ b/src/sql/ob_spi.cpp @@ -4324,6 +4324,7 @@ int ObSPIService::spi_extend_collection(pl::ObPLExecCtx *ctx, for (int64_t j = coll_cnt - n; OB_SUCC(ret) && j < coll_cnt; ++j) { if (ith_elem.is_pl_extend()) { CK (OB_NOT_NULL(table->get_allocator())); + OZ (ObUserDefinedType::destruct_obj(data[j], ctx->exec_ctx_->get_my_session())); OZ (ObUserDefinedType::deep_copy_obj(*(table->get_allocator()), ith_elem, data[j])); } else { new (&(data[j]))ObObj(ith_elem);