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 提供了一个基于 LLVM 的 JIT 实现。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);
如果您发现文档中有不正确的内容、与您使用特定功能的经验不符或需要进一步说明,请使用此表单来报告文档问题。