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

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

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

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

Примечание

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

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

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

32.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);