30.4. РаÑÑиÑÑемоÑÑÑ
30.4.1. ÐоддеÑжка вÑÑÑÐ°Ð¸Ð²Ð°Ð½Ð¸Ñ ÐºÐ¾Ð´Ð° Ð´Ð»Ñ ÑаÑÑиÑений
ÐÑли Ð²Ñ Ñ Ð¾ÑиÑе компилиÑоваÑÑ ÑаÑÑиÑÐµÐ½Ð¸Ñ Postgres Pro Ñ Ð¿Ð¾Ð´Ð´ÐµÑжкой вÑÑÑÐ°Ð¸Ð²Ð°Ð½Ð¸Ñ JIT, наÑÑÑойÑе окÑÑжение Ð´Ð»Ñ ÑазÑабоÑки как опиÑано в ÐодÑазделе 16.1.5.
ÐеÑ
анизм JIT в Postgres Pro Ð¼Ð¾Ð¶ÐµÑ Ð²ÑÑÑаиваÑÑ Ð² код ÑеализаÑии ÑÑнкÑий (Ñипа C и internal), а Ñакже опеÑаÑоÑов, иÑполÑзÑÑÑиÑ
ÑÑи ÑÑнкÑии. ЧÑÐ¾Ð±Ñ ÑÑо вÑÑÑаивание вÑполнÑлоÑÑ Ð´Ð»Ñ ÑÑнкÑий в ÑаÑÑиÑениÑÑ
, должно бÑÑÑ Ð´Ð¾ÑÑÑпно опÑеделение ÑÑиÑ
ÑÑнкÑий. ÐÑи ÑбоÑке Ñ Ð¸ÑполÑзованием PGXS ÑаÑÑиÑÐµÐ½Ð¸Ñ Ð´Ð»Ñ ÑеÑвеÑа, ÑкомпилиÑованного Ñ JIT-поддеÑжкой LLVM, ÑооÑвеÑÑÑвÑÑÑие ÑÐ°Ð¹Ð»Ñ Ð±ÑдÑÑ ÑобиÑаÑÑÑÑ Ð¸ ÑÑÑанавливаÑÑÑÑ Ð°Ð²ÑомаÑиÑеÑки.
СооÑвеÑÑÑвÑÑÑие ÑÐ°Ð¹Ð»Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ ÑÑÑанавливаÑÑÑÑ Ð² $pkglibdir/bitcode/$extension/, а инÑоÑмаÑÐ¸Ñ Ð¾ ниÑ
должна вноÑиÑÑÑÑ Ð² $pkglibdir/bitcode/$extension.index.bc, где $pkglibdir â каÑалог, коÑоÑÑй вÑдаÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° pg_config --pkglibdir, а $extension â базовое Ð¸Ð¼Ñ ÑазделÑемой библиоÑеки данного ÑаÑÑиÑениÑ.
ÐÑимеÑание
ÐÐ»Ñ ÑÑнкÑий, вÑÑÑоеннÑÑ
в Postgres Pro, двоиÑнÑй код ÑÑÑанавливаеÑÑÑ Ð² $pkglibdir/bitcode/postgres.
30.4.2. ÐодклÑÑаемÑе пÑовайдеÑÑ JIT
Postgres Pro пÑедоÑÑавлÑÐµÑ ÑеализаÑÐ¸Ñ JIT на базе LLVM. ÐнÑеÑÑÐµÐ¹Ñ JIT пÑедÑÑмаÑÑÐ¸Ð²Ð°ÐµÑ Ð´Ð¸Ð½Ð°Ð¼Ð¸ÑеÑкое подклÑÑение пÑовайдеÑа и позволÑÐµÑ Ð¼ÐµÐ½ÑÑÑ Ð¿ÑÐ¾Ð²Ð°Ð¹Ð´ÐµÑ Ð±ÐµÐ· пеÑекомпилÑÑии (Ñ Ð¾ÑÑ Ð² наÑÑоÑÑее вÑÐµÐ¼Ñ Ð¿Ñи ÑбоÑке пÑедоÑÑавлÑеÑÑÑ Ð¿Ð¾Ð´Ð´ÐµÑжка вÑÑÑÐ°Ð¸Ð²Ð°Ð½Ð¸Ñ ÑолÑко Ð´Ð»Ñ LLVM). ÐÑÐ¾Ð²Ð°Ð¹Ð´ÐµÑ Ð²ÑбиÑаеÑÑÑ Ð¿Ð°ÑамеÑÑом jit_provider.
30.4.2.1. ÐнÑеÑÑÐµÐ¹Ñ Ð¿ÑовайдеÑа 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);