openGauss源码解析(115)
openGauss源码解析:执行器解析(8)
4. BitmapOr算子
BitmapOr节点同BitmapAnd节点类似,主要差异是BitmapAnd对子计划结果做求交计算(tbm_intersect),而BitmapOr是对子计划结果做并集计算(tbm_union)。BitmapOr算子提供的主要函数如表7-9所示。
表7-9 BitmapOr算子主要函数
主要函数 | 说明 |
|---|---|
ExecInitBitmapOr | BitmapOr节点初始化 |
MultiExecBitmapOr | 获取Bitmap节点 |
ExecEndBitmapOr | 关闭BitmapOr节点 |
ExecReScanBitmapOr | 重新扫描BitmapOr节点 |
5. RecursiveUnion算子
RecursiveUnion算子对应的代码源文件是“nodeRecursiveUnion.cpp”,用于递归处理UNION语句。
下面给出一个例子,用SQL实现1到10递归求和,语句如下:
/* 递归求和 */
WITH RECURSIVE t_recursive_union(i)AS(
VALUES (0)
UNION ALL
SELECT i + 1 FROM t_recursive_union WHERE i < 10)
SELECT sum(i) FROM t_recursive_union;
/* 查询计划 */
Aggregate
CTE t_recursive_union
-> Recursive Union
-> Values Scan on "*VALUES*"
-> WorkTable Scan on t_recursive_union
Filter: (i < 10)
-> CTE Scan on t_recursive_union
上述例子由RecursiveUnion算子处理,初始数据是VALUSE (0),然后再递归部分处理输出,即“SELECT i + 1 FROM t_recursive_union WHERE i < 10”。
RecursiveUnion使用左子树获取初始元组(初始迭代种子),使用右子树递归输出其余元组。RecursiveUnion算子提供的主要函数如表7-10所示。
表7-10 RecursiveUnion算子主要函数
主要函数 | 说明 |
|---|---|
ExecInitRecursiveUnion | 初始化RecursiveUnion状态节点 |
ExecRecursiveUnion | 迭代输出元组 |
ExecEndRecursiveUnion | 清理RecursiveUnion节点 |
ExecReScanRecursiveUnion | 重置RecursiveUnion节点 |
ExecReScanRecursivePlanTree | 重置RecursiveUnion计划树 |
RecursiveUnion算子对应的关键结构体代码如下:
typedef struct RecursiveUnion
{
Planplan;
intwtParam;/* 对应的工作表ID */
intnumCols;/* 去重属性个数 */
AttrNumber *dupColIdx;/* 去重判断属性编号 */
Oid *dupOperators;/* 去重判断函数 */
Oid *dupCollations;
longnumGroups;/* 元组树估算 */
} RecursiveUnion;
ExecInitRecursiveUnion函数的主要执行流程如下。
(1) 构造递归合并状态节点,并初始化工作表(working_table)和缓存表(intermediate_table),如果需要去除重复则需要构造哈希表上下文。
(2) 初始化左子节点(用于输出初始元组作为迭代种子)和右子节点(用于迭代输出其他满足迭代条件的元组)。
(3) 创建用于去重的哈希表。
ExecRecursiveUnion函数是RecursiveUnion节点的主体函数,它的主要执行流程是:
(1) 执行左子节点,将获取元组直接返回(左子节点用于输出初始迭代种子);如需要去重则把元组加入哈希表中。
(2) 当处理完左节点(所有的初始种子已经输出),则执行右子节点获取其余元组,在执行右子节点时会逐一从工作表(working_table)获取迭代输入,并把非空的元组放入缓存表(intermediate_table)。
(3) 当工作表为空时,则把缓存表作为新的工作表,直至所有的元组都输出(缓存表和工作表都为空),如需要去重则把元组加入哈希表中。
ExecEndRecursiveUnion是清理函数,负责释放执行过程申请的存储资源(用于去重的哈希表),并关闭左子节点和右子节点。

浙公网安备 33010602011771号