[to #48067600] fix cursor null composite parameter
This commit is contained in:
@ -2327,6 +2327,19 @@ int ObPLExecState::set_var(int64_t var_idx, const ObObjParam& value)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (OB_FAIL(ret)) {
|
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()) {
|
} else if (!copy_value.is_ext()) {
|
||||||
bool is_ref_cursor = params->at(var_idx).is_ref_cursor_type();
|
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());
|
copy_value.ObObj::set_scale(params->at(var_idx).get_meta().get_scale());
|
||||||
|
|||||||
@ -196,14 +196,12 @@ int ObPLPackage::instantiate_package_state(const ObPLResolveCtx &resolve_ctx,
|
|||||||
if (var_type.is_cursor_type()
|
if (var_type.is_cursor_type()
|
||||||
&& OB_FAIL(resolve_ctx.session_info_.init_cursor_cache())) {
|
&& OB_FAIL(resolve_ctx.session_info_.init_cursor_cache())) {
|
||||||
LOG_WARN("failed to init cursor cache", K(ret));
|
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,
|
} else if (OB_FAIL(var_type.init_session_var(resolve_ctx,
|
||||||
var_type.is_cursor_type() ?
|
var_type.is_cursor_type() ?
|
||||||
package_state.get_pkg_cursor_allocator()
|
package_state.get_pkg_cursor_allocator()
|
||||||
: package_state.get_pkg_allocator(),
|
: package_state.get_pkg_allocator(),
|
||||||
exec_ctx,
|
exec_ctx,
|
||||||
get_default_expr(var->get_default()),
|
var->is_formal_param() ? NULL : get_default_expr(var->get_default()),
|
||||||
var->is_default_construct(),
|
var->is_default_construct(),
|
||||||
value))) {
|
value))) {
|
||||||
LOG_WARN("init sesssion var failed", K(ret));
|
LOG_WARN("init sesssion var failed", K(ret));
|
||||||
|
|||||||
@ -206,6 +206,12 @@ int ObPLPackageState::set_package_var_val(const int64_t var_idx, const ObObj &va
|
|||||||
ObObj copy;
|
ObObj copy;
|
||||||
OZ (ObUserDefinedType::deep_copy_obj(inner_allocator_, value, copy));
|
OZ (ObUserDefinedType::deep_copy_obj(inner_allocator_, value, copy));
|
||||||
OX (vars_.at(var_idx) = 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 {
|
} else {
|
||||||
vars_.at(var_idx) = value;
|
vars_.at(var_idx) = value;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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) {
|
for (int64_t i = 0; OB_SUCC(ret) && i < record->get_count(); ++i) {
|
||||||
OZ (destruct_obj(record->get_element()[i], session));
|
OZ (destruct_obj(record->get_element()[i], session));
|
||||||
}
|
}
|
||||||
OX (src.set_null());
|
OX (record->set_null());
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default: {
|
default: {
|
||||||
|
|||||||
Reference in New Issue
Block a user