openGauss源码解析(134)

openGauss源码解析:执行器解析(27)

ExecTargetList函数主要执行流程如下。

(1) 遍历targetlist中的表达式。
(2) 计算表达式结果。
(3) 判断结果中itemIsDone[resind]参数并生成最后的元组。

ExecTargetList函数的执行流程如图7-19所示。

图7-19 ExecTargetList函数执行流程

ExecProject函数的作用是进行投影操作,投影操作是一种属性过滤过程,该操作将对元组的属性进行精简,把在上层计划节点中不需要用的属性从元组中去掉,从而构造一个精简版的元组。投影操作中被保留下来的那些属性被称为投影属性。主要结构体代码如下:

typedef struct ProjectionInfo {

NodeTag type;

List* pi_targetlist; /*目标列表*/

ExprContext* pi_exprContext; /*内存上下文*/

TupleTableSlot* pi_slot; /*投影结果*/

ExprDoneCond* pi_itemIsDone; /*ExecProject的工作区数组*/

bool pi_directMap;

int pi_numSimpleVars; /*在原始tlist(查询目标列表)中找到的简单变量数*/

int* pi_varSlotOffsets; /*指示变量来自哪个slot(槽位)的数组*/

int* pi_varNumbers; /*包含变量的输入属性数的数组*/

int* pi_varOutputCols; /*包含变量的输出属性数的数组*/

int pi_lastInnerVar; /*内部参数*/

int pi_lastOuterVar; /*外部参数*/

int pi_lastScanVar; /*扫描参数*/

List* pi_acessedVarNumbers;

List* pi_sysAttrList;

List* pi_lateAceessVarNumbers;

List* pi_maxOrmin; /*列表优化,指示获取此列的最大值还是最小值*/

List* pi_PackTCopyVars; /*记录需要移动的列*/

List* pi_PackLateAccessVarNumbers; /*记录cstore(列存储)扫描中移动的内容的列*/

bool pi_const;

VectorBatch* pi_batch;

vectarget_func jitted_vectarget; /* LLVM函数指针*/

VectorBatch* pi_setFuncBatch;

} ProjectionInfo;

ExecProject函数的主要执行流程如下。

(1) 取ProjectionInfo需要投影的信息。按照执行的偏移获取原属性所在的元组,通过偏移量获取该属性,并通过目标属性的序号找到对应的新元组属性位置进行赋值。
(2) 对pi_targetlist进行运算,将结果赋值给对应元组中的属性。
(3)产生一个行记录结果,对slot做标记处理,slot包含一个有效的虚拟元组。

ExecProject函数的执行流程如图7-20所示。

图7-20 ExecProject函数执行流程

posted @ 2024-04-30 10:50  openGauss-bot  阅读(2)  评论(0编辑  收藏  举报