[to #48067600] fix cursor null composite parameter

This commit is contained in:
obdev
2023-08-10 11:18:41 +00:00
committed by ob-robot
parent b49b600a1c
commit 9c1ecf2166
4 changed files with 21 additions and 4 deletions

View File

@ -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<ObPLCollection *>(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());

View File

@ -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));

View File

@ -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;
}

View File

@ -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: {