Перейти к основному содержимому

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

примечание

Эта страница переведена при помощи нейросети GigaChat.

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

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

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

Примечание

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

Расширяемые JIT-провайдеры

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

Интерфейс провайдера 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);