PostgreSQL 的JIT实现可以内联类型 C
和 internal
的函数主体,以及基于此类函数的运算符。若要针对扩展功能执行此操作,需要提供这些函数的定义。使用 PGXS 针对已使用 LLVM JIT 支持编译的服务器构建扩展功能时,系统将自动构建并安装相关文件。
相关文件必须安装到 $pkglibdir/bitcode/$extension/
,并将它们汇总安装到 $pkglibdir/bitcode/$extension.index.bc
,其中 $pkglibdir
是 pg_config --pkglibdir
返回的目录,$extension
是扩展功能的共享库的基本名称。
对于内置于 PostgreSQL 中的函数,位代码将安装到 $pkglibdir/bitcode/postgres
中。
PostgreSQL 提供一项JIT基于 LLVM 的实现。与JITprovider 是可插拔的,并且无需重新编译即可更改 provider(尽管当前,构建过程仅为 LLVM 提供内联支持数据)。主动 provider 通过设置 jit_provider 选择。
AJITprovider 通过动态加载命名共享库进行加载。使用常规库搜索路径找到该库。为了提供所需的JITprovider 回调并指示该库实际上是一个JITprovider,它需要提供名为 _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);