From ce7584d0fe51266e8317bd0fc9884d49564bd241 Mon Sep 17 00:00:00 2001 From: shadowao Date: Mon, 25 Mar 2024 13:50:55 +0000 Subject: [PATCH] [CP] fix select outrow lob into user var --- src/sql/engine/basic/ob_select_into_op.cpp | 7 +++++++ src/sql/ob_spi.cpp | 9 +++++++++ 2 files changed, 16 insertions(+) diff --git a/src/sql/engine/basic/ob_select_into_op.cpp b/src/sql/engine/basic/ob_select_into_op.cpp index 4df55119ff..d2e5459843 100644 --- a/src/sql/engine/basic/ob_select_into_op.cpp +++ b/src/sql/engine/basic/ob_select_into_op.cpp @@ -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 &select_exprs = (MY_SPEC.select_exprs_.empty()) ? MY_SPEC.output_ : MY_SPEC.select_exprs_; const ObIArray &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)); diff --git a/src/sql/ob_spi.cpp b/src/sql/ob_spi.cpp index e037532791..bde1c96cc1 100644 --- a/src/sql/ob_spi.cpp +++ b/src/sql/ob_spi.cpp @@ -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(result_expr), &value, false, true));