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函数执行流程