PostgreSQL 的JIT实现可以内联类型为 C 和 internal 的函数体,以及基于此类函数的运算符。要做到这一点,对于扩展中的函数,需要使其定义可用。当使用 PGXS 来针对已使用 LLVM JIT 支持编译的服务器构建扩展时,相关文件将自动构建并安装。
相关文件必须安装到 $pkglibdir/bitcode/$extension/,并将其摘要安装到 $pkglibdir/bitcode/$extension.index.bc,其中 $pkglibdir 是 pg_config --pkglibdir 返回的目录,而 $extension 是扩展共享库的基本名称。
对于构建在 PostgreSQL 本身中的函数,其 bitcode 将安装到 $pkglibdir/bitcode/postgres。
PostgreSQL 提供了一个JIT基于 LLVM 的实现。到JIT提供者的接口是可插入的,并且可以在不重新编译的情况下更改提供者(尽管目前,构建过程仅为 LLVM 提供内联支持数据)。通过设置 jit_provider 来选择活动提供者。
一个JIT提供者通过动态加载指定的共享库来加载。正常的库搜索路径用于定位该库。为了提供所需的JIT提供者回调,并表明该库实际上是一个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);