From 43b3c03021dec0719da9a17357248be9ce188aa0 Mon Sep 17 00:00:00 2001 From: obdev Date: Thu, 20 Apr 2023 14:11:31 +0000 Subject: [PATCH] [to #49146511] fix ObPLComposite::copy_element if src equal to dest --- src/pl/ob_pl_user_type.cpp | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/pl/ob_pl_user_type.cpp b/src/pl/ob_pl_user_type.cpp index b4dccf1df..0642ceabd 100644 --- a/src/pl/ob_pl_user_type.cpp +++ b/src/pl/ob_pl_user_type.cpp @@ -1437,7 +1437,8 @@ int ObPLComposite::copy_element(const ObObj &src, { int ret = OB_SUCCESS; if (src.is_ext()) { - ObPLComposite *dest_composite = reinterpret_cast(dest.get_ext()); + ObPLComposite *dest_composite + = (dest.get_ext() == src.get_ext()) ? NULL : reinterpret_cast(dest.get_ext()); ObPLComposite *src_composite = reinterpret_cast(src.get_ext()); CK (OB_NOT_NULL(src_composite)); OZ (ObPLComposite::deep_copy(*src_composite, @@ -1447,6 +1448,19 @@ int ObPLComposite::copy_element(const ObObj &src, session, need_new_allocator)); CK (OB_NOT_NULL(dest_composite)); + if (src.get_ext() == dest.get_ext()) { + OZ (ObPLComposite::deep_copy(*dest_composite, + src_composite, + allocator, + ns, + session, + need_new_allocator)); + OX (dest.set_extend(reinterpret_cast(dest_composite), + src.get_meta().get_extend_type(), + src.get_val_len())); + OZ (ObUserDefinedType::destruct_obj(dest, session)); + OX (dest_composite = src_composite); + } OX (dest.set_extend(reinterpret_cast(dest_composite), src.get_meta().get_extend_type(), src.get_val_len()));