diff --git a/src/sql/ob_spi.cpp b/src/sql/ob_spi.cpp index c9a3aa128b..0ca53e31f1 100644 --- a/src/sql/ob_spi.cpp +++ b/src/sql/ob_spi.cpp @@ -8803,6 +8803,7 @@ int ObSPIService::spi_copy_opaque( ObPLOpaque &src, ObPLOpaque *&dest, uint64_t package_id) { int ret = OB_SUCCESS; + bool is_new_opaque = false; UNUSEDx(ctx, package_id); if (NULL == dest) { CK (OB_NOT_NULL(allocator)); @@ -8811,6 +8812,7 @@ int ObSPIService::spi_copy_opaque( LOG_WARN("failed to alloc memory for dest opaque", K(ret), K(src.get_init_size())); } OX (new (dest)ObPLOpaque()); + OX (is_new_opaque = true); } if (OB_SUCC(ret)) { switch (src.get_type()) { @@ -8834,6 +8836,10 @@ int ObSPIService::spi_copy_opaque( OZ (src.deep_copy(dest)); } break; } + if (OB_FAIL(ret) && is_new_opaque) { + dest->~ObPLOpaque(); + dest = NULL; + } } return ret; }