openGauss源码解析(142)
openGauss源码解析:执行器解析(35)
7.5.4 VecSortCodeGen类
VecSortCodeGen是为sort节点LLVM化定义的一个类,类中的接口声明在“codegen/vecsortcodegen.h”文件中,接口描述如表7-36所示。
表7-36 VecSortCodeGen接口汇总
接口名称 | 接口类型 | 职责描述 |
JittableCompareMultiColumn | API | 判断sort node节点是否支持LLVM |
CompareMultiColumnCodeGen | API | 为CompareMultiColumn函数生成LLVM函数 |
CompareMultiColumnCodeGen_TOPN | API | 在Top N sort场景下为CompareMultiColumn函数生成LLVM函数 |
bpcharcmpCodeGen_long(short) | API | 为bpcharcmp函数生成LLVM函数 |
LLVMIRmemcmp_CMC_CodeGen | API | 为memcmp函数生成LLVM函数 |
textcmpCodeGen | API | 为text_cmp函数生成LLVM函数 |
numericcmpCodeGen | API | 为numeric_cmp函数生成LLVM函数 |
JittableSortAggMatchKey | API | 判断sort aggregation中match_key函数是否支持LLVM |
SortAggMatchKeyCodeGen | API | 为sort aggregation中match_key函数生成LLVM函数 |
SortAggBpchareqCodeGen | API | 为Bpchareq函数生成LLVM函数 |
SortAggMemcmpCodeGen_long(short) | API | match_key中为memcmp函数生成LLVM函数 |
如果cosider_codegen为Ture,那么CompareMultiColumnCodeGen对sort节点进行LLVM化。此外如果父节点是Limit节点,那么还要继续通过CompareMultiColumnCodeGen_TOPN函数对sort节点进一步LLVM化。
if (consider_codegen) {
/* 根据行数判断是否使用codegen,如果使用则开始codegen */
jitted_comparecol = dorado::VecSortCodeGen::CompareMultiColumnCodeGen(sort_stat, use_prefetch); /* 为sort操作进行codegen */
if (jitted_comparecol != NULL) {
/* 如果生成了llvm函数则加到MCJIT LIST中 */
llvm_codegen->addFunctionToMCJit(jitted_comparecol, reinterpret_cast<void**>(&(sort_stat->jitted_CompareMultiColumn)));
}
Plan* plan_tree = estate->es_plannedstmt->planTree;
/* 如果sort节点包含“limit”父节点则继续调用相应codegen函数 */
bool has_topn = MatchLimitNode(node, plan_tree);
if (has_topn && (jitted_comparecol != NULL)) {
jitted_comparecol_topn= dorado::VecSortCodeGen::CompareMultiColumnCodeGen_TOPN(sort_stat,
use_prefetch);
if (jitted_comparecol_topn != NULL) {
llvm_codegen->addFunctionToMCJit(jitted_comparecol_topn, reinterpret_cast<void**>(&(sort_stat->jitted_CompareMultiColumn_TOPN)));
}
}
}
在调用时,与其他类一样,首先判断节点是否LLVM化,没有LLVM化则进行非codegen的处理。
if (jitted_CompareMultiColumn) /* 如果有codegen则使用jit */
compareMultiColumn = ((LLVM_CMC_func)(jitted_CompareMultiColumn));
else
compareMultiColumn = CompareMultiColumn<false>