openGauss源码解析(119)

openGauss源码解析:执行器解析(12)

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逐一取出元组。

8. ValuesScan算子

ValuesScan算子用于处理“Values (…),(…), …”类型语句,从值列表中输出元组,对应与ValuesScan计划节点,相关的代码源文件是“nodeValuesScan.cpp”。values_lists数组存储值表达式列表。算子对应的主要函数如表7-19所示。

表7-19 ValuesScan 主要函数

主要函数

说明

ExecInitValuesScan

初始化ValuesScan状态节点

ExecValuesScan

迭代获取元组

ExecEndValuesScan

清理ValuesScan状态节点

ExecValuesMarkPos

标记扫描位置

ExecEndValuesRestrPos

重置扫描位置

ExecResScanValuesScan

重置ValuesScan状态节点

ExecInitValuesScan函数初始化ValuesScan状态节点,该函数把值表达式链表转换成表达式数组,该表达式数组即为元组集合。

ExecValuesScan函数迭代输出元组,通过回调函数调用ValuesNext函数实现,curr_idx字段是偏移位置,从exprlists数组中逐一取出数值构造元组。

9. CteScan算子

CteScan算子用于处理With表达式对应的子查询,对应于CteScan计划节点,相应的代码源文件是“nodeCteScan.cpp”。算子对应的主要函数如表7-20所示。

表7-20 CteScan算子主要函数

主要函数

说明

ExecInitCteScan

初始化CteScan状态节点

ExecCteScan

迭代获取元组

ExecEndCteScan

清理CteScan状态节点

ExecResScanCteScan

重置CteScan状态节点

ExecInitCteScan函数初始化CteScan状态节点。主要执行流程如下。

(1) 获得Cte计划节点。
(2) 根据全局参数prmdata(所有CteScan子计划共享)判断当前CteScan计划是否为起始Cte,如果是则构造cte_table用于缓存。
(3) 初始化目标表达式和条件过滤表达式。
(4) 初始化元组用于缓存。

ExecCteScan函数用于迭代获取元组,通过回调函数调用CteScanNext实现。主要执行流程是:首先判断缓存数组中是否有未取元组,如果有则取出返回(使用tuplestore_gettupleslot函数),否则执行子计划获取元组。

posted @ 2024-04-30 10:40  openGauss-bot  阅读(5)  评论(0编辑  收藏  举报