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