PostgreSQLLa base de données la plus sophistiquée au monde.
Documentation PostgreSQL 16.4 » Administration du serveur » JIT (compilation à la volée) » Extensibilité

32.4. Extensibilité #

32.4.1. Support de l'intégration pour les extensions #

L'implémentation JIT de PostgreSQL peut intégrer le corps des fonctions de type C et internal, ainsi que les opérateurs basés sur ces fonctions. Voir Section 32.1.2. Pour le faire pour les fonctions au sein des extensions, la définition de ces fonctions doit être disponible. En utilisant PGXS pour construire une extension pour un serveur compilé avec le support JIT LLVM, les fichiers nécessaires seront automatiquement installés.

Les fichiers adéquats doivent être installés dans $pkglibdir/bitcode/$extension/ et un résumé de ceux-ci dans $pkglibdir/bitcode/$extension.index.bc, où $pkglibdir est le répertoire retourné par pg_config --pkglibdir et $extension le nom (basename) de la librairie partagée de l'extension.

Note

Pour les fonctions construites dans PostgreSQL même, le bitcode est installé dans $pkglibdir/bitcode/postgres.

32.4.2. Fournisseur JIT interchangeable #

PostgreSQL fournit une implémentation du JIT basée sur LLVM. L'interface au fournisseur du JIT est ouverte et le fournisseur peut être changé sans recompiler (bien qu'actuellement, le processus de construction fournit seulement des données de support pour LLVM). Le fournisseur actif est choisi par le GUC jit_provider.

32.4.2.1.  Interface du fournisseur JIT #

Un fournisseur JIT est chargé en chargeant dynamiquement la librairie partagée indiquée. Pour la situer, le chemin de recherche de librairie habituel est utilisé. Pour fournir les callbacks du fournisseur JIT et pour indiquer que la librairie est bien un fournisseur JIT, cette dernière doit fournir une fonction C nommée _PG_jit_provider_init. À cette fonction est passée une structure qui doit être remplie avec les pointeurs des fonctions callback pour les différentes actions.

struct JitProviderCallbacks
{
    JitProviderResetAfterErrorCB reset_after_error;
    JitProviderReleaseContextCB release_context;
    JitProviderCompileExprCB compile_expr;
};

extern void _PG_jit_provider_init(JitProviderCallbacks *cb);