Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
clmforever
oceanbase
提交
2599b6fb
O
oceanbase
项目概览
clmforever
/
oceanbase
与 Fork 源项目一致
Fork自
oceanbase / oceanbase
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
O
oceanbase
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
2599b6fb
编写于
11月 15, 2022
作者:
O
obdev
提交者:
wangzelin.wzl
11月 15, 2022
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
[to #45996634] fix select into pack.complex.elem memory
上级
c0ed086b
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
47 addition
and
5 deletion
+47
-5
src/sql/engine/expr/ob_expr_to_outfile_row.cpp
src/sql/engine/expr/ob_expr_to_outfile_row.cpp
+3
-3
src/sql/ob_spi.cpp
src/sql/ob_spi.cpp
+39
-2
src/sql/ob_spi.h
src/sql/ob_spi.h
+5
-0
未找到文件。
src/sql/engine/expr/ob_expr_to_outfile_row.cpp
浏览文件 @
2599b6fb
...
...
@@ -235,9 +235,9 @@ int ObExprToOutfileRow::print_field(char *buf, const int64_t buf_len, int64_t &p
const
bool
need_enclose
=
0
!=
out_info
.
wchar_enclose_
&&
(
!
out_info
.
is_optional_
||
obj
.
is_string_type
());
if
(
need_enclose
)
{
OZ
(
out_info
.
enclose_
.
print_plain_str_literal
(
buf
,
buf_len
,
pos
,
out_info
.
print_params_
));
}
if
(
0
==
out_info
.
wchar_escape_
)
{
OZ
(
out_info
.
enclose_
.
print_plain_str_literal
(
buf
,
buf_len
,
pos
,
out_info
.
print_params_
));
}
if
(
0
==
out_info
.
wchar_escape_
)
{
OZ
(
obj
.
print_plain_str_literal
(
buf
,
buf_len
,
pos
,
out_info
.
print_params_
));
}
else
if
(
obj
.
is_null
())
{
OZ
(
out_info
.
escape_
.
print_plain_str_literal
(
buf
,
buf_len
,
pos
,
out_info
.
print_params_
));
...
...
src/sql/ob_spi.cpp
浏览文件 @
2599b6fb
...
...
@@ -5558,6 +5558,40 @@ int ObSPIService::collect_cells(ObNewRow &row,
return
ret
;
}
int
ObSPIService
::
check_package_dest_and_deep_copy
(
ObPLExecCtx
&
ctx
,
const
ObSqlExpression
&
expr
,
ObIArray
<
ObObj
>
&
src_array
,
ObIArray
<
ObObj
>
&
dst_array
)
{
int
ret
=
OB_SUCCESS
;
if
(
is_obj_access_expression
(
expr
))
{
if
(
expr
.
get_expr_items
().
count
()
>
1
&&
T_OP_GET_PACKAGE_VAR
==
expr
.
get_expr_items
().
at
(
1
).
get_item_type
()
&&
OB_NOT_NULL
(
expr
.
get_expr_items
().
at
(
1
).
get_expr_operator
())
&&
expr
.
get_expr_items
().
at
(
1
).
get_expr_operator
()
->
get_result_type
().
is_ext
())
{
uint16_t
param_pos
=
expr
.
get_expr_items
().
at
(
1
).
get_param_idx
();
uint64_t
package_id
=
OB_INVALID_ID
;
ObIAllocator
*
allocator
=
NULL
;
OX
(
package_id
=
expr
.
get_expr_items
().
at
(
param_pos
).
get_obj
().
get_uint64
());
OZ
(
spi_get_package_allocator
(
&
ctx
,
package_id
,
allocator
));
CK
(
OB_NOT_NULL
(
allocator
));
for
(
int64_t
i
=
0
;
OB_SUCC
(
ret
)
&&
i
<
src_array
.
count
();
++
i
)
{
ObObj
tmp
;
if
(
src_array
.
at
(
i
).
is_pl_extend
())
{
pl
::
ObUserDefinedType
::
deep_copy_obj
(
*
allocator
,
src_array
.
at
(
i
),
tmp
);
}
else
{
OZ
(
ob_write_obj
(
*
allocator
,
src_array
.
at
(
i
),
tmp
));
}
OZ
(
dst_array
.
push_back
(
tmp
));
}
}
else
{
OZ
(
dst_array
.
assign
(
src_array
));
}
}
else
{
OZ
(
dst_array
.
assign
(
src_array
));
}
return
ret
;
}
int
ObSPIService
::
store_result
(
ObPLExecCtx
*
ctx
,
const
ObSqlExpression
*
result_expr
,
const
ObDataType
*
result_types
,
...
...
@@ -5700,8 +5734,10 @@ int ObSPIService::store_result(ObPLExecCtx *ctx,
ParamStore
*
params
=
ctx
->
params_
;
ObObjParam
result_address
;
if
(
is_obj_access_expression
(
*
result_expr
))
{
//通过ObjAccess访问得到的基础变量或record
ObSEArray
<
ObObj
,
16
>
dst_array
;
OZ
(
spi_calc_expr
(
ctx
,
result_expr
,
OB_INVALID_INDEX
,
&
result_address
));
OZ
(
store_datums
(
result_address
,
*
calc_array
));
OZ
(
check_package_dest_and_deep_copy
(
*
ctx
,
*
result_expr
,
*
calc_array
,
dst_array
));
OZ
(
store_datums
(
result_address
,
dst_array
));
}
else
if
(
is_question_mark_expression
(
*
result_expr
))
{
//通过question mark访问得到的基础变量
int64_t
param_idx
=
get_const_value
(
*
result_expr
).
get_unknown
();
ObAccuracy
accuracy
;
...
...
@@ -5722,7 +5758,8 @@ int ObSPIService::store_result(ObPLExecCtx *ctx,
OX
(
params
->
at
(
param_idx
).
set_accuracy
(
accuracy
));
OZ
(
spi_pad_char_or_varchar
(
ctx
->
exec_ctx_
->
get_my_session
(),
result_types
[
0
].
get_obj_type
(),
accuracy
,
ctx
->
allocator_
,
&
(
params
->
at
(
param_idx
))));
}
else
if
(
is_get_var_func_expression
(
*
result_expr
)
||
is_get_package_or_subprogram_var_expression
(
*
result_expr
))
{
}
else
if
(
is_get_var_func_expression
(
*
result_expr
)
||
is_get_package_or_subprogram_var_expression
(
*
result_expr
))
{
//通过系统函数访问的基础变量(user var/sys var) 或 访问的package/subprogram 变量
ObObjParam
value
;
OX
(
value
=
calc_array
->
at
(
0
));
...
...
src/sql/ob_spi.h
浏览文件 @
2599b6fb
...
...
@@ -793,6 +793,11 @@ private:
const
int64_t
*
pl_integer_ranges
,
bool
is_bulk
,
int64_t
limit
);
static
int
check_package_dest_and_deep_copy
(
pl
::
ObPLExecCtx
&
ctx
,
const
ObSqlExpression
&
expr
,
ObIArray
<
ObObj
>
&
src_array
,
ObIArray
<
ObObj
>
&
dst_array
);
};
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录