Postgresql 中文操作指南

32.4. Extensibility #

32.4.1. Inlining Support for Extensions #

PostgreSQL 的 JIT 实现可以内联类型为 Cinternal 的函数主体,以及基于此类函数的运算符。要对扩展中的函数执行此操作,需要提供这些函数的定义。当使用 PGXS 对已使用 LLVM JIT 支持编译的服务器构建扩展时,将自动构建和安装相关文件。

相关文件必须安装到 $pkglibdir/bitcode/$extension/,并将其摘要安装到 $pkglibdir/bitcode/$extension.index.bc,其中 $pkglibdir 是由 pg_config --pkglibdir 返回的目录,而 $extension 是扩展的共享库的基本名称。

Note

对于内置于 PostgreSQL 自身的函数,将字节码安装到 $pkglibdir/bitcode/postgres

32.4.2. Pluggable JIT Providers #

PostgreSQL 提供了基于 LLVM 的 JIT 实现。与 JIT 提供程序的接口是可以插入的,并且可以更改提供程序而不重新编译(不过目前构建过程仅针对 LLVM 提供内联支持数据)。通过设置 jit_provider 来选择活动提供程序。

32.4.2.1. JIT Provider Interface #

可以通过动态加载命名的共享库来加载 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);