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.
Para las funciones integradas en el propio PostgreSQL,
el código de bits (bitcode) se instala en
$pkglibdir/bitcode/postgres.
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.
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);