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

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

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

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

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

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

Примечание

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

31.4.2. Подключаемые поставщики JIT

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

31.4.2.1. Интерфейс поставщика JIT

A 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);