Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Greenplum
Gpdb
提交
12cfd7bd
G
Gpdb
项目概览
Greenplum
/
Gpdb
通知
7
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
G
Gpdb
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
12cfd7bd
编写于
10月 11, 2016
作者:
N
Nikos Armenatzoglou
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Support offset calculation when there is null in the tuple and codegen is enabled
Signed-off-by:
N
Nikhil Kak
<
nkak@pivotal.io
>
上级
96f22dac
变更
3
显示空白变更内容
内联
并排
Showing
3 changed file
with
33 addition
and
6 deletion
+33
-6
src/backend/codegen/codegen_wrapper.cc
src/backend/codegen/codegen_wrapper.cc
+5
-0
src/backend/codegen/slot_getattr_codegen.cc
src/backend/codegen/slot_getattr_codegen.cc
+22
-6
src/include/codegen/codegen_wrapper.h
src/include/codegen/codegen_wrapper.h
+6
-0
未找到文件。
src/backend/codegen/codegen_wrapper.cc
浏览文件 @
12cfd7bd
...
...
@@ -107,6 +107,11 @@ slot_getattr_regular(TupleTableSlot *slot, int attnum, bool *isnull) {
return
slot_getattr
(
slot
,
attnum
,
isnull
);
}
int
att_align_nominal_regular
(
int
cur_offset
,
char
attalign
)
{
return
att_align_nominal
(
cur_offset
,
attalign
);
}
void
*
ExecVariableListCodegenEnroll
(
ExecVariableListFn
regular_func_ptr
,
ExecVariableListFn
*
ptr_to_chosen_func_ptr
,
...
...
src/backend/codegen/slot_getattr_codegen.cc
浏览文件 @
12cfd7bd
...
...
@@ -195,6 +195,9 @@ bool SlotGetAttrCodegen::GenerateSlotGetAttr(
llvm
::
Function
*
llvm_slot_deform_tuple
=
codegen_utils
->
GetOrRegisterExternalFunction
(
slot_deform_tuple
,
"slot_deform_tuple"
);
llvm
::
Function
*
llvm_att_align_nominal
=
codegen_utils
->
GetOrRegisterExternalFunction
(
att_align_nominal_regular
,
"att_align_nominal"
);
// Generation-time constants
llvm
::
Value
*
llvm_slot
=
codegen_utils
->
GetConstant
(
slot
);
...
...
@@ -363,7 +366,11 @@ bool SlotGetAttrCodegen::GenerateSlotGetAttr(
llvm
::
Value
*
llvm_tuple_data_ptr
=
irb
->
CreateInBoundsGEP
(
llvm_heaptuple_t_data
,
{
llvm_heaptuple_t_data_t_hoff
});
int
off
=
0
;
// int off = 0;
llvm
::
Value
*
llvm_off_ptr
=
irb
->
CreateAlloca
(
codegen_utils
->
GetType
<
int
>
(),
nullptr
,
"off"
);
irb
->
CreateStore
(
codegen_utils
->
GetConstant
<
int
>
(
0
),
llvm_off_ptr
);
TupleDesc
tupleDesc
=
slot
->
tts_tupleDescriptor
;
Form_pg_attribute
*
att
=
tupleDesc
->
attrs
;
...
...
@@ -500,12 +507,16 @@ bool SlotGetAttrCodegen::GenerateSlotGetAttr(
irb
->
SetInsertPoint
(
is_not_null_block
);
}
// End of if ( !thisatt->attnotnull )
off
=
att_align_nominal
(
off
,
thisatt
->
attalign
);
// off = att_align_nominal(off, thisatt->attalign);
irb
->
CreateStore
(
irb
->
CreateCall
(
llvm_att_align_nominal
,
{
irb
->
CreateLoad
(
llvm_off_ptr
),
codegen_utils
->
GetConstant
<
char
>
(
thisatt
->
attalign
)}),
llvm_off_ptr
);
// values[attnum] = fetchatt(thisatt, tp + off) {{{
llvm
::
Value
*
llvm_next_t_data_ptr
=
irb
->
CreateInBoundsGEP
(
llvm_tuple_data_ptr
,
{
codegen_utils
->
GetConstant
(
off
)});
{
irb
->
CreateLoad
(
llvm_off_ptr
)});
llvm
::
Value
*
llvm_colVal
=
nullptr
;
if
(
thisatt
->
attbyval
)
{
...
...
@@ -560,10 +571,15 @@ bool SlotGetAttrCodegen::GenerateSlotGetAttr(
llvm_next_isnull_ptr
);
// }}} End of isnull[attnum] = false;
// off += thisatt->attlen;
irb
->
CreateStore
(
irb
->
CreateAdd
(
irb
->
CreateLoad
(
llvm_off_ptr
),
codegen_utils
->
GetConstant
<
int
>
(
thisatt
->
attlen
)),
llvm_off_ptr
);
// Jump to next attribute
irb
->
CreateBr
(
next_attribute_block
);
off
+=
thisatt
->
attlen
;
// Process next attribute
attribute_block
=
next_attribute_block
;
}
// end for
...
...
@@ -588,8 +604,8 @@ bool SlotGetAttrCodegen::GenerateSlotGetAttr(
codegen_utils
->
GetPointerToMember
(
llvm_slot
,
&
TupleTableSlot
::
PRIVATE_tts_off
);
irb
->
CreateStore
(
codegen_utils
->
GetConstant
<
long
>
(
off
),
// NOLINT(runtime/int)
llvm_slot_PRIVATE_tts_off_ptr
);
codegen_utils
->
CreateCast
<
long
,
int
>
(
// NOLINT(runtime/int)
irb
->
CreateLoad
(
llvm_off_ptr
)),
llvm_slot_PRIVATE_tts_off_ptr
);
// slot->PRIVATE_tts_nvalid = attnum;
irb
->
CreateStore
(
codegen_utils
->
GetConstant
(
attnum
),
...
...
src/include/codegen/codegen_wrapper.h
浏览文件 @
12cfd7bd
...
...
@@ -167,6 +167,12 @@ SetActiveCodeGeneratorManager(void* manager);
Datum
slot_getattr_regular
(
struct
TupleTableSlot
*
slot
,
int
attnum
,
bool
*
isnull
);
/*
* Wrapper function for att_align_nominal.
*/
int
att_align_nominal_regular
(
int
cur_offset
,
char
attalign
);
/*
* returns the pointer to the ExecVariableList
*/
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录