30.4. Расширяемость#
30.4. Расширяемость #
30.4.1. Поддержка встраивания для расширений #
Tantor BE's JIT
реализация может встраивать тела функций
типов C и internal, а также
операторы, основанные на таких функциях. Для этого необходимо
сделать доступными определения этих функций в расширениях.
При использовании PGXS для создания расширения
на сервере, скомпилированном с поддержкой LLVM JIT, соответствующие файлы
будут автоматически собраны и установлены.
Необходимо установить соответствующие файлы в каталог $pkglibdir/bitcode/$extension/, а их краткое описание в файл $pkglibdir/bitcode/$extension.index.bc, где $pkglibdir - это каталог, возвращаемый командой pg_config --pkglibdir, а $extension - это базовое имя разделяемой библиотеки расширения.
Примечание
Для функций, встроенных в саму Tantor BE,
битовый код устанавливается в
$pkglibdir/bitcode/postgres.
30.4.2. Подключаемые поставщики JIT #
Tantor BE предоставляет реализацию JIT на основе LLVM. Интерфейс к поставщику JIT является подключаемым, и поставщик может быть изменен без повторной компиляции (хотя в настоящее время процесс сборки обеспечивает только данные поддержки инлайнинга для LLVM). Активный поставщик выбирается с помощью параметра jit_provider.
30.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);