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函数),否则执行子计划获取元组。