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函数实现重新扫描。

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