30.4. Расширяемость #
30.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
.
30.4.2. Подключаемые провайдеры JIT #
PostgreSQL предоставляет реализацию 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);