diff --git a/src/pl/ob_pl.cpp b/src/pl/ob_pl.cpp index 2bcf6eb77e..e3920a6bc2 100644 --- a/src/pl/ob_pl.cpp +++ b/src/pl/ob_pl.cpp @@ -2327,6 +2327,19 @@ int ObPLExecState::set_var(int64_t var_idx, const ObObjParam& value) } if (OB_FAIL(ret)) { + } else if (copy_value.is_null() && params->at(var_idx).is_pl_extend()) { + if (params->at(var_idx).get_ext() == 0) { + const ObUserDefinedType *user_type = NULL; + uint64_t udt_id = params->at(var_idx).get_udt_id(); + OZ (ctx_.get_user_type(udt_id, user_type), K(udt_id)); + CK (OB_NOT_NULL(user_type)); + OZ (init_complex_obj(*get_allocator(), *user_type, params->at(var_idx))); + if (OB_SUCC(ret) && user_type->is_collection_type()) { + ObPLCollection *coll = reinterpret_cast(params->at(var_idx).get_ext()); + CK (OB_NOT_NULL(coll)); + OX (coll->set_count(OB_INVALID_COUNT)); + } + } } else if (!copy_value.is_ext()) { bool is_ref_cursor = params->at(var_idx).is_ref_cursor_type(); copy_value.ObObj::set_scale(params->at(var_idx).get_meta().get_scale()); diff --git a/src/pl/ob_pl_package.cpp b/src/pl/ob_pl_package.cpp index 0f0420e920..b0f5806d17 100644 --- a/src/pl/ob_pl_package.cpp +++ b/src/pl/ob_pl_package.cpp @@ -196,14 +196,12 @@ int ObPLPackage::instantiate_package_state(const ObPLResolveCtx &resolve_ctx, if (var_type.is_cursor_type() && OB_FAIL(resolve_ctx.session_info_.init_cursor_cache())) { LOG_WARN("failed to init cursor cache", K(ret)); - } else if (var->is_formal_param()) { - // cursor formal param will as variable added to symbol, skip cursor formal param init } else if (OB_FAIL(var_type.init_session_var(resolve_ctx, var_type.is_cursor_type() ? package_state.get_pkg_cursor_allocator() : package_state.get_pkg_allocator(), exec_ctx, - get_default_expr(var->get_default()), + var->is_formal_param() ? NULL : get_default_expr(var->get_default()), var->is_default_construct(), value))) { LOG_WARN("init sesssion var failed", K(ret)); diff --git a/src/pl/ob_pl_package_state.cpp b/src/pl/ob_pl_package_state.cpp index af5504a0b3..39f223c514 100644 --- a/src/pl/ob_pl_package_state.cpp +++ b/src/pl/ob_pl_package_state.cpp @@ -206,6 +206,12 @@ int ObPLPackageState::set_package_var_val(const int64_t var_idx, const ObObj &va ObObj copy; OZ (ObUserDefinedType::deep_copy_obj(inner_allocator_, value, copy)); OX (vars_.at(var_idx) = copy); + } else if (value.is_null() + && vars_.at(var_idx).is_pl_extend() + && types_.at(var_idx) != PL_CURSOR_TYPE + && types_.at(var_idx) != PL_REF_CURSOR_TYPE) { + CK (vars_.at(var_idx).get_ext() != 0); + OZ (ObUserDefinedType::destruct_obj(vars_.at(var_idx))); } else { vars_.at(var_idx) = value; } diff --git a/src/pl/ob_pl_user_type.cpp b/src/pl/ob_pl_user_type.cpp index 92bb927e43..8e9917058d 100644 --- a/src/pl/ob_pl_user_type.cpp +++ b/src/pl/ob_pl_user_type.cpp @@ -330,7 +330,7 @@ int ObUserDefinedType::destruct_obj(ObObj &src, ObSQLSessionInfo *session) for (int64_t i = 0; OB_SUCC(ret) && i < record->get_count(); ++i) { OZ (destruct_obj(record->get_element()[i], session)); } - OX (src.set_null()); + OX (record->set_null()); } break; default: {