[to #47311946] fix memory leak of composite assign
This commit is contained in:
@ -126,35 +126,7 @@ int ObPLPkgAllocator::copy_all_element_with_new_allocator(ObIAllocator *allocato
|
|||||||
if (vars.at(i).is_pl_extend()
|
if (vars.at(i).is_pl_extend()
|
||||||
&& vars.at(i).get_meta().get_extend_type() != PL_CURSOR_TYPE) {
|
&& vars.at(i).get_meta().get_extend_type() != PL_CURSOR_TYPE) {
|
||||||
OZ (pl::ObUserDefinedType::deep_copy_obj(*allocator, vars.at(i), dst, true));
|
OZ (pl::ObUserDefinedType::deep_copy_obj(*allocator, vars.at(i), dst, true));
|
||||||
if (OB_SUCC(ret)) {
|
OZ (pl::ObUserDefinedType::destruct_obj(vars.at(i), nullptr));
|
||||||
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<ObPLCollection*>(vars.at(i).get_ext());
|
|
||||||
if (OB_NOT_NULL(coll) && OB_NOT_NULL(coll->get_allocator())) {
|
|
||||||
if (NULL == dynamic_cast<ObPLCollAllocator *>(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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
OZ (deep_copy_obj(*allocator, vars.at(i), dst));
|
OZ (deep_copy_obj(*allocator, vars.at(i), dst));
|
||||||
}
|
}
|
||||||
|
|||||||
@ -162,13 +162,14 @@ void ObPLPackageState::reset(ObSQLSessionInfo *session_info)
|
|||||||
changed_vars_.reset();
|
changed_vars_.reset();
|
||||||
for (int64_t i = 0; i < types_.count(); ++i) {
|
for (int64_t i = 0; i < types_.count(); ++i) {
|
||||||
if (!vars_.at(i).is_ext()) {
|
if (!vars_.at(i).is_ext()) {
|
||||||
} else if (PL_NESTED_TABLE_TYPE == types_.at(i)
|
} else if (PL_RECORD_TYPE == types_.at(i)
|
||||||
|
|| PL_NESTED_TABLE_TYPE == types_.at(i)
|
||||||
|| PL_ASSOCIATIVE_ARRAY_TYPE == types_.at(i)
|
|| PL_ASSOCIATIVE_ARRAY_TYPE == types_.at(i)
|
||||||
|| PL_VARRAY_TYPE == types_.at(i)) {
|
|| PL_VARRAY_TYPE == types_.at(i)
|
||||||
ObPLCollection *coll = reinterpret_cast<ObPLCollection *>(vars_.at(i).get_ext());
|
|| PL_OPAQUE_TYPE == types_.at(i)) {
|
||||||
if (OB_NOT_NULL(coll)
|
int ret = OB_SUCCESS;
|
||||||
&& OB_NOT_NULL(dynamic_cast<ObPLCollAllocator *>(coll->get_allocator()))) {
|
if (OB_FAIL(ObUserDefinedType::destruct_obj(vars_.at(i), session_info))) {
|
||||||
coll->get_allocator()->reset();
|
LOG_WARN("failed to destruct composte obj", K(ret));
|
||||||
}
|
}
|
||||||
} else if (PL_CURSOR_TYPE == types_.at(i)) {
|
} else if (PL_CURSOR_TYPE == types_.at(i)) {
|
||||||
ObPLCursorInfo *cursor = reinterpret_cast<ObPLCursorInfo *>(vars_.at(i).get_ext());
|
ObPLCursorInfo *cursor = reinterpret_cast<ObPLCursorInfo *>(vars_.at(i).get_ext());
|
||||||
|
|||||||
Reference in New Issue
Block a user