openGauss源码解析(120)
openGauss源码解析:执行器解析(13)
10. WorkTableScan算子
WorkTableScan算子用于处理递归项,同RecursiveUnion算子紧密关联,对应的代码源文件是“nodeWorkTableScan.cpp”。WorkTableScan算子处理RecursiveUnion子节点中的工作表,提供了对缓存扫描的支持。算子对应的主要函数如表7-21所示。
表7-21 WorkTableScan算子主要函数
主要函数 | 说明 |
ExecInitWorkTableScan | 初始化WorkTableScan状态节点 |
ExecWorkTableScan | 迭代获取元组 |
ExecEndWorkTableScan | 清理WorkTableScan状态节点 |
ExecResScanWorkTableScan | 重置WorkTableScan状态节点 |
11. PartIterator算子
PartIterator算子用于支持分区wise join,从分区中迭代获取元组,对应的代码源文件是“nodePartIterator.cpp”。PartIterator算子通过执行子节点计划获取分区遍历获取元组。算子对应的主要函数如表7-22所示。
表7-22 ParIterator算子主要函数
主要函数 | 说明 |
ExecInitPartIteratorScan | 初始化PartIteratorScan状态节点 |
ExecPartIteratorScan | 迭代获取元组 |
ExecEndPartIteratorScan | 清理PartIteratorScan状态节点 |
ExecResScanPartIteratorScan | 重置PartIteratorScan状态节点 |
分区遍历关键数据结构代码如下:
typedef struct PartIterator {
Plan plan;
PartitionType partType; /* 分区类型 */
int itrs; /* 分区数量 */
ScanDirection direction;
PartIteratorParam* param;
int startPartitionId; /* 并行执行起始分区ID */
int endPartitionId; /* 并行执行分区结束ID */
} PartIterator;
typedef struct PartIteratorState {
PlanState ps; /* 状态节点类型 */
int currentItr; /* 当前迭代分区索引编号 */
} PartIteratorState;
ExecInitPartIteratorScan函数用于初始化PartIteratorScan状态节点(PartIteratorState),功能是初始化左子节点并设置初始迭代分区索引号。
ExecPartIteratorScan函数迭代输出元组。主要执行流程是:首先初始化分区索引号,执行左子节点获取元组,如果元组为空则获取下一个分区的元组。