第三方通过 PGXS 为 PostgreSQL 开发编写自定义扩展插件时,只要宿主编译了 LLVM 支持,打包工具链会自动为 C 语言函数编译生成对应的 LLVM 位码(Bitcode)文件(存放在 $pkglibdir/bitcode/ 中),使自定义插件函数同样能够享受被核心查询 JIT 内联展开的顶级加速红利。
PostgreSQL 提供了基于 LLVM 的 JIT 实现。JIT 提供程序接口是可插拔的,无需重新编译即可切换提供程序(通过参数 jit_provider 选择)。
JIT 提供程序以动态库形式加载,需导出一个名为 _PG_jit_provider_init 的 C 入口函数,在其中填入用于处理重置、释放上下文与表达式编译的回调函数指针:
struct JitProviderCallbacks
{
JitProviderResetAfterErrorCB reset_after_error;
JitProviderReleaseContextCB release_context;
JitProviderCompileExprCB compile_expr;
};
extern void _PG_jit_provider_init(JitProviderCallbacks *cb);