openGauss源码解析(144)

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

2. VectorModifyTable算子

VecModifyTable算子用于处理INSERT、UPDATE、DELETE操作,对应的代码源文件是“vecmodifytable.cpp”;对应的主要数据结构是VecModifyTableState,VecModifyTableState继承于ModifyTableState。具体定义代码如下所示:

typedef struct VecModifyTableState : public ModifyTableState {

VectorBatch* m_pScanBatch; /* 工作元组 */

VectorBatch* m_pCurrentBatch; /* 输出元组 */

} VecModifyTableState;

VecModifyTable算子相关的函数包括ExecInitVecModifyTable(初始化节点)、ExecVecModifyTable(执行节点)、ExecEndVecModifyTable(退出节点)。

ExecInitVecModifyTable函数用于初始化VecModifyTable算子,调用ExecInitModifyTable函数实现算子的初始化。

ExecVecModifyTable函数是执行VecModifyTable算子的主体函数,循环地从子计划中获取目标列并根据要求修改每一列,通过“switch(operation)”处理不同的修改操作,具体的修改操作包括CMD_INSERT(插入)、CMD_DELETE(删除)、CMD_UPDATE(更新)。

ExecEndVecModifyTable函数用于在执行VecModifyTable算子结束时调用ExecEndModifyTable函数清除相关资源。

3. VecAppend算子

VecAppend算子用于处理包含一个或多个子计划的链表,通过遍历子计划链表逐个执行子计划,对应的代码源文件是“vecappend.cpp”;对应的主要数据结构是VecAppendState,VecAppendState继承于AppendState。

VecAppend算子相关的函数包括ExecInitVecAppend(初始化节点)、ExecVecAppend(执行节点)、ExecReScanAppend(重置节点)、ExecEndVecAppend(退出节点)。

ExecInitVecAppend函数用于初始化VecAppend算子。执行执行流程如图7-30所示,主要执行流程如下。

(1) 创建并初始化执行节点VecAppend。
(2) 分配存储投影结果的slot。
(3) 循环初始化子计划链表。
(4) 初始化扫描描述符并设置初始迭代。

图7-30 ExecInitVecAppend函数执行流程

ExecVecAppend函数是执行VecAppend算子的主体函数。执行流程如图7-31所示,每次从子计划中获取一条元组,当取回全部元组时,移动到下一个子计划,直到执行全部子计划。

图7-31 ExecVecAppend执行流程

ExecEndVecAppend函数用于在执行结束时清理VecAppend算子,释放相应的子计划。

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