[CP] fix select outrow lob into user var
This commit is contained in:
parent
4b424e4750
commit
ce7584d0fe
@ -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));
|
||||
|
@ -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));
|
||||
|
Loading…
x
Reference in New Issue
Block a user