[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() | ||||
|           && vars.at(i).get_meta().get_extend_type() != PL_CURSOR_TYPE) { | ||||
|         OZ (pl::ObUserDefinedType::deep_copy_obj(*allocator, vars.at(i), dst, true)); | ||||
|         if (OB_SUCC(ret)) { | ||||
|           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; | ||||
|           } | ||||
|         } | ||||
|         OZ (pl::ObUserDefinedType::destruct_obj(vars.at(i), nullptr)); | ||||
|       } else { | ||||
|         OZ (deep_copy_obj(*allocator, vars.at(i), dst)); | ||||
|       } | ||||
|  | ||||
| @ -162,13 +162,14 @@ void ObPLPackageState::reset(ObSQLSessionInfo *session_info) | ||||
|   changed_vars_.reset(); | ||||
|   for (int64_t i = 0; i < types_.count(); ++i) { | ||||
|     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_VARRAY_TYPE == types_.at(i)) { | ||||
|       ObPLCollection *coll = reinterpret_cast<ObPLCollection *>(vars_.at(i).get_ext()); | ||||
|       if (OB_NOT_NULL(coll) | ||||
|           && OB_NOT_NULL(dynamic_cast<ObPLCollAllocator *>(coll->get_allocator()))) { | ||||
|         coll->get_allocator()->reset(); | ||||
|                || PL_VARRAY_TYPE == types_.at(i) | ||||
|                || PL_OPAQUE_TYPE == types_.at(i)) { | ||||
|       int ret = OB_SUCCESS; | ||||
|       if (OB_FAIL(ObUserDefinedType::destruct_obj(vars_.at(i), session_info))) { | ||||
|         LOG_WARN("failed to destruct composte obj", K(ret)); | ||||
|       } | ||||
|     } else if (PL_CURSOR_TYPE == types_.at(i)) { | ||||
|       ObPLCursorInfo *cursor = reinterpret_cast<ObPLCursorInfo *>(vars_.at(i).get_ext()); | ||||
|  | ||||
		Reference in New Issue
	
	Block a user
	 obdev
					obdev