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