[to #49106078] fix package record value with default expression

This commit is contained in:
obdev
2023-08-18 12:22:26 +08:00
committed by ob-robot
parent 392f7dfe04
commit 47b45ab107
4 changed files with 67 additions and 7 deletions

View File

@ -1267,17 +1267,33 @@ int ObRecordType::init_session_var(const ObPLResolveCtx &resolve_ctx,
ObPLRecord *record = reinterpret_cast<ObPLRecord*>(data);
ObObj *member = NULL;
for (int64_t i = 0; OB_SUCC(ret) && i < get_member_count(); ++i) {
const ObRecordMember* record_member = get_record_member(i);
const ObPLDataType* member_type = get_record_member_type(i);
CK (OB_NOT_NULL(get_member(i)));
OZ (record->get_element(i, member));
CK (OB_NOT_NULL(member));
if (get_member(i)->is_obj_type()) {
OX (new (member) ObObj(ObNullType));
CK (OB_NOT_NULL(record_member));
CK (OB_NOT_NULL(member_type));
if (OB_FAIL(ret)) {
} else if (record_member->get_default() != OB_INVALID_INDEX) {
uint64_t package_id = extract_package_id(get_user_type_id());
int64_t expr_idx = record_member->get_default();
ObObjParam result;
OV (is_package_type(), OB_ERR_UNEXPECTED, KPC(this));
OV (package_id != OB_INVALID_ID, OB_ERR_UNEXPECTED, KPC(this));
OV (expr_idx != OB_INVALID_INDEX, OB_ERR_UNEXPECTED, KPC(this));
OZ (sql::ObSPIService::spi_calc_package_expr_v1(resolve_ctx, exec_ctx, obj_allocator, package_id, expr_idx, &result));
OX (*member = result);
} else {
int64_t init_size = OB_INVALID_SIZE;
int64_t member_ptr = 0;
OZ (get_member(i)->get_size(resolve_ctx, PL_TYPE_INIT_SIZE, init_size));
OZ (get_member(i)->newx(obj_allocator, &resolve_ctx, member_ptr));
OX (member->set_extend(member_ptr, get_member(i)->get_type(), init_size));
if (get_member(i)->is_obj_type()) {
OX (new (member) ObObj(ObNullType));
} else {
int64_t init_size = OB_INVALID_SIZE;
int64_t member_ptr = 0;
OZ (get_member(i)->get_size(resolve_ctx, PL_TYPE_INIT_SIZE, init_size));
OZ (get_member(i)->newx(obj_allocator, &resolve_ctx, member_ptr));
OX (member->set_extend(member_ptr, get_member(i)->get_type(), init_size));
}
}
}
}

View File

@ -462,6 +462,7 @@ public:
virtual int convert(ObPLResolveCtx &ctx, ObObj *&src, ObObj *&dst) const;
TO_STRING_KV(K_(type),
K_(type_from),
K_(user_type_id),
K_(record_members));
private:

View File

@ -960,6 +960,43 @@ int ObSPIService::spi_calc_subprogram_expr(ObPLExecCtx *ctx,
return ret;
}
int ObSPIService::spi_calc_package_expr_v1(const pl::ObPLResolveCtx &resolve_ctx,
sql::ObExecContext &exec_ctx,
ObIAllocator &allocator,
uint64_t package_id,
int64_t expr_idx,
ObObjParam *result)
{
int ret = OB_SUCCESS;
ObSqlExpression *sql_expr = NULL;
ObPLPackageManager &pl_manager = resolve_ctx.session_info_.get_pl_engine()->get_package_manager();
ObCacheObjGuard *cache_obj_guard = NULL;
ObPLPackage *package = NULL;
ObPLPackageGuard &guard = resolve_ctx.package_guard_;
OZ (pl_manager.get_package_expr(resolve_ctx, package_id, expr_idx, sql_expr));
CK (OB_NOT_NULL(sql_expr));
OZ (guard.get(package_id, cache_obj_guard));
CK (OB_NOT_NULL(cache_obj_guard));
CK (OB_NOT_NULL(package = static_cast<ObPLPackage*>(cache_obj_guard->get_cache_obj())));
if (OB_SUCC(ret)) {
ExecCtxBak exec_ctx_bak;
sql::ObPhysicalPlanCtx phy_plan_ctx(exec_ctx.get_allocator());
OX (exec_ctx_bak.backup(exec_ctx));
OX (exec_ctx.set_physical_plan_ctx(&phy_plan_ctx));
if (OB_SUCC(ret) && package->get_expr_op_size() > 0) {
OZ (exec_ctx.init_expr_op(package->get_expr_op_size()));
}
OZ (package->get_frame_info().pre_alloc_exec_memory(exec_ctx));
OZ (ObSQLUtils::calc_sql_expression_without_row(exec_ctx, *sql_expr, *result, &allocator));
if (package->get_expr_op_size() > 0) {
exec_ctx.reset_expr_op();
exec_ctx.get_allocator().free(exec_ctx.get_expr_op_ctx_store());
}
exec_ctx_bak.restore(exec_ctx);
}
return ret;
}
int ObSPIService::spi_calc_package_expr(ObPLExecCtx *ctx,
uint64_t package_id,
int64_t expr_idx,

View File

@ -338,6 +338,12 @@ public:
int64_t expr_idx,
ObObjParam *result);
static int spi_calc_package_expr_v1(const pl::ObPLResolveCtx &resolve_ctx,
sql::ObExecContext &exec_ctx,
ObIAllocator &allocator,
uint64_t package_id,
int64_t expr_idx,
ObObjParam *result);
static int spi_calc_package_expr(pl::ObPLExecCtx *ctx,
uint64_t package_id,
int64_t expr_idx,