openGauss源码解析(141)

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

7.5.3 VecHashJoinCodeGen类

VecHashAggCodeGen类的定义在“codegen/vechashjoincodegen.h”文件中,接口说明如表7-35所示。

表7-35 VecHashAggCodeGen接口汇总

接口名称

接口类型

职责描述

GetSimpHashCondExpr

API

返回var表达式

JittableHashJoin

API

判断当前hash join节点是否支持LLVM化

JittableHashJoin_buildandprobe

API

判断buildHashTable/probeHashTable是否可以LLVM化

JittableHashJoin_bloomfilter

API

判断bloom filter(布隆过滤器)函数是否能LLVM化

HashJoinCodeGen

API

hash join节点构建IR函数的主函数

HashJoinCodeGen_fastpath

API

hash join节点生成快速IR函数

KeyMatchCodeGen

API

keyMatch函数生成LLVM函数

HashJoinCodeGen_buildHashTable

API

为buildHashTable函数生成LLVM函数

HashJoinCodeGen_buildHashTable_NeedCopy

API

分区表中buildHashTable函数生成LLVM函数

HashJoinCodeGen_probeHashTable

API

probeHashTable生成LLVM函数

在函数ExecInitVecHashJoin中,为hash join节点进行CodeGen的代码为:

if (consider_codegen && !node->isSonicHash) {

dorado::VecHashJoinCodeGen::HashJoinCodeGen(hash_state);

}

其中consider_codegen是根据行数判断是否进行CodeGen。HashJoinCodeGen是hash join节点LLVM化的主入口,与其他可LLVM化的节点一样,生成IR函数后,将IR函数与节点结构体中对应变量绑定,如图7-27所示。

图7-27 HashJoinCodeGen函数执行流程

图中所有CodeGen函数返回都是“LLVM::Function”类型的IR函数指针,其中值得注意的是当enable_fast_keyMatch的值等于0时,是正常的“key match”;等于2时,所有key值类型都是int4或者int8并且不为NULL,这时候可使用更少的内存和更少的分支,所以叫作“fast path”。

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