openGauss源码解析(151)
openGauss源码解析:执行器解析(45)
7. VecSetOp算子
VecSetOp算子用于处理EXECEPT和INTERSECT集合操作。一般一个VecSetOp算子中只能处理两个集合之间的集合操作,对于多个集合之间的集合操作,需要多个SetOp实现。
VecSetOp算子对应的代码源文件是“vecsetop.cpp”。VecSetOp算子对应的主要数据结构是VecSetOpState,继承于SetOpState。相关代码如下:
typedef struct VecSetOpState : public SetOpState {
void* vecSetOpInfo;
} VecSetOpState;
VecSetOp算子中对应的核心函数有:ExecInitVecSetOp(初始化节点)、ExecVecSetOp(执行节点)、ExecEndVecSetOp(退出节点)、ExecReScanVecSetOp(重置节点)。
ExecInitVecSetOp函数用于初始化VecSetOp算子。主要执行流程如下。
(1) 创建并初始化VecSetOpState执行节点。
(2) 调用ExecInitResultTupleSlot函数分配存储投影结果的slot。
(3) 调用ExecInitnode函数初始化子节点。
(4) 调用ExecAssignResultTypeFromTL函数初始化结果扫描描述符。
ExecVecSetOp函数是VecSetOp算子的主体函数,通过执行VecSetOp算子状态机,产生resultBatch。
ExecEndVecSetOp函数用于清理VecSetOp算子执行过程中使用的资源。通过调用freeMemoryContext函数释放内存上下文,通过调用ExecClearTuple函数清理元组缓存,通过调用ExecEndNode函数清理执行节点。
ExecReScanVecSetOp函数用于重新执行扫描计划,通过调用ExecClearTuple函数清理元组结果缓存,通过调用ResetNecessary函数重置相应执行节点。