PostgreSQLのJIT実装は、C
とinternal
型の関数の本体をインライン展開できます。そうした関数に基づく演算子も同様です。
拡張の関数に同じことを行うには、関数の定義が入手可能である必要があります。
LLVM JITサポートがコンパイルされているサーバに対してPGXSを使って拡張をビルドする際に、関連するファイルは自動的にビルドされ、インストールされます。
関連するファイルは$pkglibdir/bitcode/$extension/
に、そのサマリは$pkglibdir/bitcode/$extension.index.bc
にインストールされなければなりません。
ここで、$pkglibdir
は、pg_config --pkglibdir
が返すディレクトリで、$extension
は拡張の共有ライブラリのベース名です。
PostgreSQL自身に組み込まれた関数については、ビットコードが$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);