openGauss源码解析(152)

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

7.6.4 连接算子

1. VecNestLoop算子

VecNestLoop算子对应的主要数据结构是VecNestLoopState,VecNestLoopState继承于NestLoopState。具体定义代码如下:

struct VecNestLoopState : public NestLoopState {

void* vecNestLoopRuntime;

vecqual_func jitted_vecqual;

vecqual_func jitted_joinqual;

};

VecNestLoop算子的相关函数包括:ExecInitVecNestLoop(初始化节点)、ExecVecNestLoop(执行节点)、ExecEndVecNestLoop(退出节点)、ExecReScanVecNestLoop(重置节点)。

ExecInitVecNestLoop函数用于初始化VecNestLoop执行算子。主要执行流程如下。

(1) 初始化VecNestLoop执行算子。
(2) 为节点创建表达式上下文,分别处理左右子树,得到外执行计划节点和内执行计划节点。
(3) 初始化元组和投影信息。

ExecVecNestLoop函数是执行VecNestLoop的主体函数,通过执行VecNestLoop状态机,并获得结果元组。

ExecEndVecNestLoop函数用于在执行结束时清理VecNestLoop算子。主要执行流程是:首先释放表达式上下文,之后清空元组,最后清空子计划节点。

ExecReScanVecNestLoop函数用于重新执行扫描计划。主要执行流程是:首先把VecNestLoop计划节点转换成外计划执行节点,之后判断外计划执行节点的chgParam是否为空,若chgParam为空,则重新扫描节点。

2. VecMergeJoin算子

VecMergeJoin算子对应的主要数据结构是VecMergeJoinState,VecMergeJoinState继承于MergeJoinState。具体定义代码如下:

struct VecMergeJoinState : public MergeJoinShared {

/* 向量化执行支持 */

VecMergeJoinClause mj_Clauses;

MJBatchOffset mj_OuterOffset;

MJBatchOffset mj_InnerOffset;

ExprContext* mj_OuterEContext;

ExprContext* mj_InnerEContext;

MJBatchOffset mj_MarkedOffset;

VectorBatch* mj_MarkedBatch;

BatchAccessor m_inputs[2];

MJBatchOffset m_prevInnerOffset;

bool m_prevInnerQualified;

MJBatchOffset m_prevOuterOffset;

bool m_prevOuterQualified;

bool m_fDone;

VectorBatch* m_pInnerMatch;

MJBatchOffset* m_pInnerOffset;

VectorBatch* m_pOuterMatch;

MJBatchOffset* m_pOuterOffset;

VectorBatch* m_pCurrentBatch;

VectorBatch* m_pReturnBatch;

vecqual_func jitted_joinqual;

};

VecMergeJoin算子的相关函数包括:ExecInitVecMergeJoin(初始化节点)、ExecVecMergeJoinT(执行节点)、ExecEndVecMergeJoin(退出节点)、ExecReScanVecMergeJoin(重置节点)。

ExecInitVecMergeJoin函数用于初始化VecMergeJoin执行算子。主要执行流程如下。

(1) 初始化VecMergeJoin执行算子。
(2) 为节点创建表达式上下文,分别处理左右子树,得到外执行计划节点和内执行计划节点。
(3) 初始化元组和投影信息。

ExecVecMergeJoinT函数是执行VecMergeJoin的主体函数,执行VecMergeJoin状态机,并根据join类型,获取结果元组。

ExecEndVecMergeJoin函数用于在执行结束时清理VecMergeJoin算子。首先释放表达式上下文,之后清空元组,最后清空左右子树节点。

ExecReScanVecMergeJoin函数用于重新执行扫描计划。主要执行流程是:首先重置节点相关参数,之后判断左右子树的chgParam是否为空;若chgParam为空时,则重新扫描节点。

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