openGauss数据库源码解析 | 执行器解析解析(11)

5. TIDScan算子

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移动偏移位置)。

6. SubqueryScan算子

SubqueryScan算子以子计划为扫描对象,实际执行会转换成调用子节点计划,对应的代码源文件是“nodeSubqueryScan.cpp”。SubqueryScan状态节点初始由ExecInitSubqueryScan函数完成。ExecInitSubqueryScan函数首先创建SubqueryScan状态节点,然后初始化子计划(调用ExecInitNode函数实现)。ExecSubqueryScan函数负责迭代输出元组,通过调用函数SubqueryNext实现,在SubqueryNext函数中使用ExecProcNode函数执行子节点计划。算子对应的主要函数如表7-17所示。

表7-17  SubqueryScan算子主要函数

主要函数

说明

ExecInitSubqueryScan

初始化SubqueryScan状态节点

ExecSubqueryScan

迭代获取元组(执行子节点计划)

ExecEndSubqueryScan

清理SubqueryScan状态节点

ExecResScanSubquerScan

重置SubqueryScan状态节点

7. FunctionScan算子

FunctionScan算子用于从函数返回的数据集中获取元组,对应的代码源文件是“nodeFunctionScan.cpp”。算子对应的主要函数如表7-18所示。

表7-18  FunctionScan算子主要函数

主要函数

说明

ExecInitFunctionScan

初始化FunctionScan状态节点

ExecFunctionScan

迭代获取元组(函数返回元组)

ExecEndFunctionScan

清理FunctionScan状态节点

ExecResScanFunctionScan

重置FunctionScan状态节点

ExecInitFunctionScan函数负责初始化FunctionScan状态节点。主要执行流程如下。

(1) 构造FuctionScan状态节点。
(2) 初始化目标表达式和过滤条件表达式。
(3) 根据functypclass的类型构造元组表述符(函数返回元组)。

ExecFunctionScan函数负责迭代输出函数返回元组。主要执行流程如下。

(1) 初始化tuplestorestate(首次执行存储函数执行的全量结果)。
(2) 从tuplestorestate逐一取出元组。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值