openGauss源码解析(145)
openGauss源码解析:执行器解析(38)
7.6.2 扫描算子
1. CStoreScan算子
CStoreScan算子用于扫描基础表,按顺序扫描基础表,对应的代码源文件是“veccstore.cpp”;CStoreScan算子对应的主要数据结构是CStoreScanState,CStoreScanState继承于ScanState。具体定义代码如下:
typedef struct CStoreScanState : ScanState {
Relation ss_currentDeltaRelation;
Relation ss_partition_parent;
TableScanDesc ss_currentDeltaScanDesc;
bool ss_deltaScan;
bool ss_deltaScanEnd;
VectorBatch* m_pScanBatch;
VectorBatch* m_pCurrentBatch;
CStoreScanRunTimeKeyInfo* m_pScanRunTimeKeys;
int m_ScanRunTimeKeysNum;
bool m_ScanRunTimeKeysReady;
CStore* m_CStore;
CStoreScanKey csss_ScanKeys;
int csss_NumScanKeys;
bool m_fSimpleMap;
bool m_fUseColumnRef;
vecqual_func jitted_vecqual;
bool m_isReplicaTable; /*复制表标记符*/
} CStoreScanState;
CStoreScan算子的相关函数包括:ExecInitCStoreScan(初始化节点)、ExecCStoreScan(执行节点)、ExecEndCStoreScan(退出节点)、ExecReScanCStoreScan(重置节点)。
ExecInitCStoreScan函数用于初始化CStoreScan算子。主要执行流程如下。
(1) 创建并初始化CStoreScan算子,为节点创建表达式上下文。
(2) 调用ExecAssignVectorForExprEval函数进行投影表达式的初始化。
(3) 调用ExecInitResultTupleSlot函数和ExecInitScanTupleSlot函数分别初始化用于投影结果和用于扫描的slot。
(4) 打开扫描表,调用ExecAssignResultTypeFromTL函数和ExecBuildVecProjectionInfo函数分别初始化结果扫描描述符和创建投影结构。
ExecCStoreScan函数是CStoreScan算子的主体函数,通过迭代的方式获取全部结果元组。
ExecEndCStoreScan函数用于在算子执行结束后清理CStoreScan算子。主要执行流程是:首先获取节点信息(包括Relation、ScanDesc),之后释放表达式上下文、元组,最后关闭相应的partition、relation。
ExecReScanCStoreScan函数用于重新执行扫描计划。主要执行流程是:首先重置runtime关键词,关闭当前节点partition信息,初始化接下来的partition信息,最后重置CStoreScan算子。