From e593faec7d0bd1d44c916ef81335b5aa0830adb6 Mon Sep 17 00:00:00 2001 From: 0xacc Date: Thu, 3 Aug 2023 08:18:31 +0000 Subject: [PATCH] [to #51332276] fix param conversion of UDT constructors --- src/sql/engine/expr/ob_expr_object_construct.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/sql/engine/expr/ob_expr_object_construct.cpp b/src/sql/engine/expr/ob_expr_object_construct.cpp index 671302473a..a03b9d3ced 100644 --- a/src/sql/engine/expr/ob_expr_object_construct.cpp +++ b/src/sql/engine/expr/ob_expr_object_construct.cpp @@ -182,11 +182,17 @@ int ObExprObjectConstruct::eval_object_construct(const ObExpr &expr, ObEvalCtx & LOG_WARN("failed to alloc memory", K(ret)); } else { new(record)pl::ObPLRecord(info->udt_id_, expr.arg_cnt_); - for (int64_t i = 0; i < expr.arg_cnt_; ++i) { + for (int64_t i = 0; OB_SUCC(ret) && i < expr.arg_cnt_; ++i) { if (objs[i].is_null() && info->elem_types_.at(i).is_ext()) { OZ (newx(ctx, record->get_element()[i], info->elem_types_.at(i).get_udt_id())); } else { - OX (record->get_element()[i] = objs[i]); + // param ObObj may have different accuracy with the argument, need conversion + OZ (ObSPIService::spi_convert(*session, + ctx.exec_ctx_.get_allocator(), + objs[i], + info->elem_types_.at(i), + record->get_element()[i], + false)); } if (OB_SUCC(ret) && (ObCharType == info->elem_types_.at(i).get_type() || ObNCharType == info->elem_types_.at(i).get_type())) {