openGauss源码解析(150)
openGauss源码解析:执行器解析(44)
5. VecAggregation算子
VecAggregation算子用于处理含有聚集函数的操作,将同一分组下的多个元组合并成一个聚集结果元组。
VecAggregation算子对应的代码源文件是“vecagg.cpp”。VecAggregation算子对应的主要数据结构是VecAggState,继承于AggState。相应代码如下:
typedef struct VecAggState : public AggState {
void* aggRun;
VecAggInfo* aggInfo;
char* jitted_hashing;
char* jitted_sglhashing;
char* jitted_batchagg;
char* jitted_sonicbatchagg;
char* jitted_SortAggMatchKey;
} VecAggState;
VecAggregation算子对应的核心函数有:ExecInitVecAggregation(初始化节点)、ExecVecAggregation(执行节点)、ExecEndVecAggregation(退出节点)、ExecReScanVecAggregation(重置节点)。
ExecInitVecAggregation函数用于初始化VecAggregation算子。主要执行流程如下。
(1) 创建并初始化VecAggState执行节点,并调用ExecAssignExprContext函数为节点创建表达式上下文。
(2) 调用ExecInitScanTupleSlot函数分配用于扫描的slot,调用ExecInitResultTupleSlot函数分配存储投影结果的slot,调用ExecInitExtraTupleSlot函数为sort_slot进行初始化。
(3) 调用投影表达式初始化函数ExecInitVecExpr依次对“plan.targetlist”和“plan.qual”进行初始化。
(4) 调用ExecInitNode函数初始化子节点,获取其中的Aggref节点。
(5) 使用每个Aggref节点中包含的聚集函数信息进行初始化,构造出对应的AggStatePerAgg。
(6) 最后根据策略类型,初始化相应的状态信息。
ExecVecAggregation函数是VecAggregation算子的主体函数。根据策略类型的不同(hash、plain、sort),调用不同的Runner函数执行。
ExecEndVecAggregation函数用于清理VecAggregation算子执行过程中使用的资源。主要执行流程是:依据选择的策略Hash、sort、plain分别调用freeMemoryContext函数、endSortAgg函数、endPlainAgg函数清理节点信息,之后分别调用ExecFreeExprContext函数和ExecClearTuple函数对表达式上下文和元组缓存进行清理。
ExecReScanVecAggregation函数用于重新执行扫描计划。主要执行流程是:根据策略类型分别调用相应的ResetNecessary函数重置相应执行节点,最后调用VecExecReScan函数实现重新扫描。
6. VecWindowAgg算子
VecWindowAgg算子用于处理窗口函数的聚集操作。不同于Agg算子,窗口函数不会将同一分组中的元组合并为一个,这样就需要对每个元组都产生一个结果元组,其中包含对应的聚集计算结果。
VecWindowAgg算子对应的代码源文件是“vecwindowagg.cpp”。VecWindowAgg算子对应的主要数据结构是VecWindowAggState,继承于WindowAggState。相关代码如下:
typedef struct VecWindowAggState : public WindowAggState {
void* VecWinAggRuntime;
VecAggInfo* windowAggInfo;
} VecWindowAggState;
VecWindowAgg算子中对应的核心函数有:ExecInitVecWindowAgg(初始化节点)、ExecVecWindowAgg(执行节点)、ExecEndVecWindowAgg(退出节点)、ExecReScanVecWindowAgg(重置节点)。
ExecInitVecWindowAgg函数用于初始化VecWindowAgg算子,主要执行流程如下。
(1) 创建并初始化VecWindowAgg执行节点,并调用ExecAssignExprContext函数为节点创建表达式上下文。
(2) 调用ExecInitResultTupleSlot函数分配存储投影结果的slot,调用ExecInitScanTupleSlot函数分配用于扫描的slot。
(3) 调用ExecInitVecExpr函数为ps.targetlist初始化投影表达式。
(4) 初始化分区判断函数和排序属性是否相同的操作函数,保存在partEqfunctions、ordEqfunctions中。
(5) 初始化funcs指向的表达式树,构造相关调用信息并存放在perfunc中。
ExecVecWindowAgg函数是VecWindowAgg算子的主体函数,通过调用getBatch执行算子,得到窗口函数的投影结果。
ExecEndVecWindowAgg函数用于清理VecWindowAgg算子执行过程中使用的资源,通过调用batchstore_end函数清理元组缓存,通过调用ExecEndNode函数清理执行节点。
ExecReScanVecWindowAgg函数用于重新执行扫描计划,通过调用ResetNecessary函数重置相应执行节点,通过调用VecExecReScan函数实现重新扫描。