TIDScan算子用于通过遍历元组的物理存储位置获取每一个元组(TID由块编号和偏移位置组成),对应TIDScanState计划节点,相应的代码源文件是“nodeTIDScan.cpp”。算子对应的主要函数如表7-16所示。
表7-16 TIDScan算子主要函数
| 主要函数 | 说明 |
| ExecInitTidScan | 初始化TIDScan状态节点 |
| ExecTidScan | 迭代获取元组 |
| ExecEndTidScan | 清理TIDScan状态节点 |
| ExecReScanTidScan | 重置TIDScan |
TID扫描算子对应的状态节点代码如下:
typedef struct TidScanState {
ScanState ss; /* 节点标识 */
List* tss_tidquals; /* tid过滤表达式 */
bool tss_isCurrentOf; /* 游标同当前扫描表是否匹配 */
Relation tss_CurrentOf_CurrentPartition; /* 当前扫描分区 */
int tss_NumTids; /* tid数量 */
int tss_TidPtr; /* 当前扫描位置 */
int tss_MarkTidPtr; /* 标记扫描位置 */
ItemPointerData* tss_TidList; /* tid列表 */
HeapTupleData tss_htup; /* 堆元组 */
HeapTupleHeaderData tss_ctbuf_hdr; /* 堆元组头信息 */
} TidScanState;
ExecInitTidScan是TIDScan节点状态初始化函数。主要执行流程如下。
(1) 创建TidScanState节点。
(2) 初始化子节点,初始化目标列表、索引过滤条件、原始过滤条件。
(3) 打开对应表。
(4) 初始化结果元组;
(5) 启动表扫描(返回表扫描描述符TableScanDesc)。
ExecTidScan是元组迭代获取函数,通过调用TidNext函数实现功能。TidNext函数首先获取Tid列表,并存放到tss_TidList数组中,根据heap_relation调用TidFetchTuple函数或HbtTidFetchTuble函数(哈希桶类型)中逐一获取元组(tss_TidPtr是tid在数组中的相对偏移位置,使用函数InitTidPtr移动偏移位置)。




