30.4. Extensibilidad #

30.4.1. Soporte de integración en línea para extensiones
30.4.2. Proveedores de JIT acoplables

30.4.1. Soporte de integración en línea para extensiones #

La implementación de JIT de PostgreSQL puede integrar en línea los cuerpos de funciones de tipos C y internal, así como operadores basados en dichas funciones. Para hacer esto con funciones en extensiones, las definiciones de esas funciones deben estar disponibles. Al usar PGXS para construir una extensión contra un servidor que ha sido compilado con soporte de LLVM JIT, los archivos relevantes se construirán e instalarán automáticamente.

Los archivos relevantes deben instalarse en $pkglibdir/bitcode/$extension/ y un resumen de ellos en $pkglibdir/bitcode/$extension.index.bc, donde $pkglibdir es el directorio devuelto por pg_config --pkglibdir y $extension es el nombre base de la biblioteca compartida de la extensión.

Note

Para las funciones integradas en el propio PostgreSQL, el código de bits (bitcode) se instala en $pkglibdir/bitcode/postgres.

30.4.2. Proveedores de JIT acoplables #

PostgreSQL proporciona una implementación de JIT basada en LLVM. La interfaz para el proveedor de JIT es acoplable y el proveedor se puede cambiar sin volver a compilar (aunque actualmente, el proceso de construcción solo proporciona datos de soporte de integración en línea para LLVM). El proveedor activo se elige mediante la configuración de la jit_provider.

30.4.2.1. Interfaz del proveedor de JIT #

Un proveedor de JIT se carga cargando dinámicamente la biblioteca compartida nombrada. Se utiliza la ruta de búsqueda de biblioteca normal para localizar la biblioteca. Para proporcionar las devoluciones de llamada (callbacks) requeridas del proveedor de JIT y para indicar que la biblioteca es realmente un proveedor de JIT, debe proporcionar una función C llamada _PG_jit_provider_init. A esta función se le pasa una estructura que debe completarse con los punteros de función de devolución de llamada para acciones individuales:

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

extern void _PG_jit_provider_init(JitProviderCallbacks *cb);