30.4. Расширяемость #

30.4.1. Поддержка встраивания кода для расширений #

Если вы хотите компилировать расширения Postgres Pro с поддержкой встраивания JIT, настройте окружение для разработки как описано в Подразделе 16.1.4.

Механизм JIT в Postgres Pro может встраивать в код реализации функций (типа C и internal), а также операторов, использующих эти функции. Чтобы это встраивание выполнялось для функций в расширениях, должно быть доступно определение этих функций. При сборке с использованием PGXS расширения для сервера, скомпилированного с JIT-поддержкой LLVM, соответствующие файлы будут собираться и устанавливаться автоматически.

Соответствующие файлы должны устанавливаться в $pkglibdir/bitcode/$extension/, а информация о них должна вноситься в $pkglibdir/bitcode/$extension.index.bc, где $pkglibdir — каталог, который выдаёт команда pg_config --pkglibdir, а $extension — базовое имя разделяемой библиотеки данного расширения.

Примечание

Для функций, встроенных в Postgres Pro, двоичный код устанавливается в $pkglibdir/bitcode/postgres.

30.4.2. Подключаемые провайдеры JIT #

Postgres Pro предоставляет реализацию JIT на базе LLVM. Интерфейс JIT предусматривает динамическое подключение провайдера и позволяет менять провайдер без перекомпиляции (хотя в настоящее время при сборке предоставляется поддержка встраивания только для LLVM). Провайдер выбирается параметром jit_provider.

30.4.2.1. Интерфейс провайдера JIT #

Провайдер JIT загружается путём динамической загрузки заданной разделяемой библиотеки. Для поиска её используется обычный путь поиска библиотек. Чтобы предоставить требуемые функции-обработчики провайдера JIT и показать, что библиотека является реализацией провайдера JIT, она должна содержать функцию, имеющую в C имя _PG_jit_provider_init. Этой функции передаётся структура, которую нужно заполнить указателями на функции-обработчики определённых действий.

struct JitProviderCallbacks
{
    JitProviderResetAfterErrorCB reset_after_error;
    JitProviderReleaseContextCB release_context;
    JitProviderCompileExprCB compile_expr;
};

extern void _PG_jit_provider_init(JitProviderCallbacks *cb);

30.4. Extensibility #

30.4.1. Inlining Support for Extensions #

If you would like to build Postgres Pro extensions that support JIT inlining, make sure to set up your development environment as explained in Section 16.1.4.

Postgres Pro's JIT implementation can inline the bodies of functions of types C and internal, as well as operators based on such functions. To do so for functions in extensions, the definitions of those functions need to be made available. When using PGXS to build an extension against a server that has been compiled with LLVM JIT support, the relevant files will be built and installed automatically.

The relevant files have to be installed into $pkglibdir/bitcode/$extension/ and a summary of them into $pkglibdir/bitcode/$extension.index.bc, where $pkglibdir is the directory returned by pg_config --pkglibdir and $extension is the base name of the extension's shared library.

Note

For functions built into Postgres Pro itself, the bitcode is installed into $pkglibdir/bitcode/postgres.

30.4.2. Pluggable JIT Providers #

Postgres Pro provides a JIT implementation based on LLVM. The interface to the JIT provider is pluggable and the provider can be changed without recompiling (although currently, the build process only provides inlining support data for LLVM). The active provider is chosen via the setting jit_provider.

30.4.2.1. JIT Provider Interface #

A JIT provider is loaded by dynamically loading the named shared library. The normal library search path is used to locate the library. To provide the required JIT provider callbacks and to indicate that the library is actually a JIT provider, it needs to provide a C function named _PG_jit_provider_init. This function is passed a struct that needs to be filled with the callback function pointers for individual actions:

struct JitProviderCallbacks
{
    JitProviderResetAfterErrorCB reset_after_error;
    JitProviderReleaseContextCB release_context;
    JitProviderCompileExprCB compile_expr;
};

extern void _PG_jit_provider_init(JitProviderCallbacks *cb);