[CP] fix select outrow lob into user var

This commit is contained in:
shadowao 2024-03-25 13:50:55 +00:00 committed by ob-robot
parent 4b424e4750
commit ce7584d0fe
2 changed files with 16 additions and 0 deletions

View File

@ -15,6 +15,7 @@
#include "sql/engine/ob_physical_plan.h"
#include "sql/engine/ob_exec_context.h"
#include "sql/engine/cmd/ob_variable_set_executor.h"
#include "sql/engine/expr/ob_expr_lob_utils.h"
#include "share/backup/ob_backup_io_adapter.h"
#include "share/ob_device_manager.h"
#include "sql/resolver/ob_resolver_utils.h"
@ -566,6 +567,7 @@ int ObSelectIntoOp::into_varlist()
const ObIArray<ObExpr*> &select_exprs = (MY_SPEC.select_exprs_.empty()) ?
MY_SPEC.output_ : MY_SPEC.select_exprs_;
const ObIArray<ObString> &user_vars = MY_SPEC.user_vars_;
ObArenaAllocator lob_tmp_allocator("LobTmp", OB_MALLOC_NORMAL_BLOCK_SIZE, MTL_ID());
if (select_exprs.count() != user_vars.count()) {
ret = OB_ERR_COLUMN_SIZE;
LOG_WARN("user vars count should be equal to select exprs count" , K(ret),
@ -579,6 +581,11 @@ int ObSelectIntoOp::into_varlist()
LOG_WARN("eval expr failed", K(ret));
} else if (OB_FAIL(datum->to_obj(obj, select_exprs.at(i)->obj_meta_))) {
LOG_WARN("convert datum to obj failed", K(ret), KPC(select_exprs.at(i)));
} else if (obj.is_lob_storage()
// outrow lob can not be assigned to user var, so convert outrow to inrow lob
// user var has independent memory, so using temporary memory here is fine
&& OB_FAIL(ObTextStringIter::convert_outrow_lob_to_inrow_templob(obj, obj, nullptr, &lob_tmp_allocator, true/*allow_persist_inrow*/))) {
LOG_WARN("convert outrow to inrow lob failed", K(ret), K(obj));
} else if (OB_FAIL(ObVariableSetExecutor::set_user_variable(obj, var_name,
ctx_.get_my_session()))) {
LOG_WARN("set user variable failed", K(ret));

View File

@ -27,6 +27,7 @@
#include "sql/resolver/ob_stmt_resolver.h"
#include "sql/engine/expr/ob_expr_column_conv.h"
#include "sql/engine/expr/ob_expr_pl_integer_checker.h"
#include "sql/engine/expr/ob_expr_lob_utils.h"
#include "pl/ob_pl_package.h"
#include "pl/ob_pl_allocator.h"
#include "sql/resolver/ob_resolver_utils.h"
@ -7811,6 +7812,14 @@ int ObSPIService::store_result(ObPLExecCtx *ctx,
//通过系统函数访问的基础变量(user var/sys var) 或 访问的package/subprogram 变量
ObObjParam value;
OX (value = calc_array->at(0));
// outrow lob can not be assigned to user var, so convert outrow to inrow lob
if (OB_SUCC(ret) && value.is_lob_storage()) {
if (OB_FAIL(ObTextStringIter::convert_outrow_lob_to_inrow_templob(value, value, nullptr, cast_ctx.allocator_v2_, true/*allow_persist_inrow*/))) {
LOG_WARN("convert outrow to inrow lob fail", K(ret), K(value));
}
}
CK (!value.is_pl_extend());
OX (value.set_param_meta());
OZ (spi_set_variable(ctx, static_cast<const ObSqlExpression*>(result_expr), &value, false, true));