[to #48896499] fix object construct with null parameter
This commit is contained in:
@ -20,6 +20,7 @@
|
|||||||
#include "pl/ob_pl.h"
|
#include "pl/ob_pl.h"
|
||||||
#include "pl/ob_pl_user_type.h"
|
#include "pl/ob_pl_user_type.h"
|
||||||
#include "sql/ob_spi.h"
|
#include "sql/ob_spi.h"
|
||||||
|
#include "pl/ob_pl_resolver.h"
|
||||||
|
|
||||||
namespace oceanbase
|
namespace oceanbase
|
||||||
{
|
{
|
||||||
@ -93,6 +94,42 @@ int ObExprObjectConstruct::cg_expr(ObExprCGCtx &op_cg_ctx,
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int ObExprObjectConstruct::newx(ObEvalCtx &ctx, ObObj &result, uint64_t udt_id)
|
||||||
|
{
|
||||||
|
int ret = OB_SUCCESS;
|
||||||
|
auto session = ctx.exec_ctx_.get_my_session();
|
||||||
|
auto &exec_ctx = ctx.exec_ctx_;
|
||||||
|
ObIAllocator &alloc = ctx.exec_ctx_.get_allocator();
|
||||||
|
pl::ObPLPackageGuard package_guard(session->get_effective_tenant_id());
|
||||||
|
pl::ObPLResolveCtx resolve_ctx(alloc,
|
||||||
|
*session,
|
||||||
|
*(exec_ctx.get_sql_ctx()->schema_guard_),
|
||||||
|
package_guard,
|
||||||
|
*(exec_ctx.get_sql_proxy()),
|
||||||
|
false);
|
||||||
|
pl::ObPLINS *ns = NULL;
|
||||||
|
if (NULL == session->get_pl_context()) {
|
||||||
|
OZ (package_guard.init());
|
||||||
|
OX (ns = &resolve_ctx);
|
||||||
|
} else {
|
||||||
|
ns = session->get_pl_context()->get_current_ctx();
|
||||||
|
}
|
||||||
|
if (OB_SUCC(ret)) {
|
||||||
|
ObObj new_composite;
|
||||||
|
int64_t ptr = 0;
|
||||||
|
int64_t init_size = OB_INVALID_SIZE;
|
||||||
|
ObArenaAllocator tmp_alloc;
|
||||||
|
const pl::ObUserDefinedType *user_type = NULL;
|
||||||
|
OZ (ns->get_user_type(udt_id, user_type, &tmp_alloc));
|
||||||
|
CK (OB_NOT_NULL(user_type));
|
||||||
|
OZ (user_type->newx(alloc, ns, ptr));
|
||||||
|
OZ (user_type->get_size(*ns, pl::PL_TYPE_INIT_SIZE, init_size));
|
||||||
|
OX (new_composite.set_extend(ptr, user_type->get_type(), init_size));
|
||||||
|
OX (result = new_composite);
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
int ObExprObjectConstruct::eval_object_construct(const ObExpr &expr, ObEvalCtx &ctx, ObDatum &res)
|
int ObExprObjectConstruct::eval_object_construct(const ObExpr &expr, ObEvalCtx &ctx, ObDatum &res)
|
||||||
{
|
{
|
||||||
int ret = OB_SUCCESS;
|
int ret = OB_SUCCESS;
|
||||||
@ -128,7 +165,11 @@ int ObExprObjectConstruct::eval_object_construct(const ObExpr &expr, ObEvalCtx &
|
|||||||
} else {
|
} else {
|
||||||
new(record)pl::ObPLRecord(info->udt_id_, expr.arg_cnt_);
|
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; i < expr.arg_cnt_; ++i) {
|
||||||
record->get_element()[i] = objs[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]);
|
||||||
|
}
|
||||||
if (OB_SUCC(ret) &&
|
if (OB_SUCC(ret) &&
|
||||||
(ObCharType == info->elem_types_.at(i).get_type() || ObNCharType == info->elem_types_.at(i).get_type())) {
|
(ObCharType == info->elem_types_.at(i).get_type() || ObNCharType == info->elem_types_.at(i).get_type())) {
|
||||||
OZ (ObSPIService::spi_pad_char_or_varchar(session,
|
OZ (ObSPIService::spi_pad_char_or_varchar(session,
|
||||||
|
|||||||
@ -68,6 +68,8 @@ public:
|
|||||||
int64_t param_num);
|
int64_t param_num);
|
||||||
static int fill_obj_stack(const ObExpr &expr, ObEvalCtx &ctx, ObObj *objs);
|
static int fill_obj_stack(const ObExpr &expr, ObEvalCtx &ctx, ObObj *objs);
|
||||||
|
|
||||||
|
static int newx(ObEvalCtx &ctx, ObObj &result, uint64_t udt_id);
|
||||||
|
|
||||||
virtual void reset() {
|
virtual void reset() {
|
||||||
rowsize_ = 0;
|
rowsize_ = 0;
|
||||||
udt_id_ = OB_INVALID_ID;
|
udt_id_ = OB_INVALID_ID;
|
||||||
|
|||||||
Reference in New Issue
Block a user