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”。