42.7. PL/Perl sous le capot

42.7.1. Configuration

Cette section liste les paramètres de configuration de PL/Perl.

plperl.on_init (string)

Spécifie un code perl à exécuter lorsque l'interpréteur Perl est initialisé pour la première fois et avant qu'il soit spécialisé pour être utilisé par plperl ou plperlu. Les fonction SPI ne sont pas disponible lorsque ce code est exécuté. Si le code lève une erreur, il interrompra l'initialisation de l'interpréteur et la propagera à la requête originale, provoquant ainsi l'annulation de la transaction ou sous-transaction courante.

Le code Perl est limité à une seule ligne. Un code plus long peut être placé dans un module et chargé par on_init. Exemples:

plperl.on_init = 'require "plperlinit.pl"'
plperl.on_init = 'use lib "/my/app"; use MyApp::PgInit;'

Tous les modules chargés par plperl.on_init, directement ou indirectement, seront disponibles depuis plperl. Cela entraîne un problème de sécurité potentiel. Pour consulter la liste des modules chargés, vous pouvez utiliser :

DO 'elog(WARNING, join ", ", sort keys %INC)' LANGUAGE plperl;

L'initialisation aura lieu au sein du postmaster si la librairie plperl est incluse dans le paramètre shared_preload_libraries), auquel cas une plus grande attention doit être portée au risque de déstabiliser ce dernier. The principal reason for making use of this feature is that Perl modules loaded by plperl.on_init need be loaded only at postmaster start, and will be instantly available without loading overhead in individual database sessions. However, keep in mind that the overhead is avoided only for the first Perl interpreter used by a database session -- either PL/PerlU, or PL/Perl for the first SQL role that calls a PL/Perl function. Any additional Perl interpreters created in a database session will have to execute plperl.on_init afresh. Also, on Windows there will be no savings whatsoever from preloading, since the Perl interpreter created in the postmaster process does not propagate to child processes.

Ce paramètre ne peut être positionné que dans le fichier postgresql.conf ou depuis la ligne de commande de démarrage du serveur.

plperl.on_plperl_init (string), plperl.on_plperlu_init (string)

These parameters specify Perl code to be executed when a Perl interpreter is specialized for plperl or plperlu respectively. This will happen when a PL/Perl or PL/PerlU function is first executed in a database session, or when an additional interpreter has to be created because the other language is called or a PL/Perl function is called by a new SQL role. This follows any initialization done by plperl.on_init. The SPI functions are not available when this code is executed. The Perl code in plperl.on_plperl_init is executed after « locking down » the interpreter, and thus it can only perform trusted operations.

Si le code lève une erreur, il interrompra l'initialisation et la propagera à la requête originale, provoquant ainsi l'annulation de la transaction ou sous-transaction courante. Any actions already done within Perl won't be undone; however, that interpreter won't be used again. If the language is used again the initialization will be attempted again within a fresh Perl interpreter.

Only superusers can change these settings. Although these settings can be changed within a session, such changes will not affect Perl interpreters that have already been used to execute functions.

plperl.use_strict (boolean)

Lorsqu'il est positionné à « true », les compilations des fonction PL/Perl suivantes auront le pragma strict activé. Ce paramètre n'affecte pas les fonctions déjà compilées au sein de la session courante.

42.7.2. Limitations et fonctionnalités absentes

Les fonctionnalités suivantes ne sont actuellement pas implémentées dans PL/Perl, mais peuvent faire l'objet de contributions généreuses de votre part.

  • Les fonctions PL/Perl ne peuvent pas s'appeler entre elles.

  • SPI n'est pas complètement implémenté.

  • Si vous récupérez des ensembles de données très importants en utilisant spi_exec_query, vous devez être conscient qu'ils iront tous en mémoire. Vous pouvez l'éviter en utilisant spi_query/spi_fetchrow comme montré précédemment.

    Un problème similaire survient si une fonction renvoyant un ensemble passe un gros ensemble de lignes à PostgreSQL via return. Vous pouvez l'éviter aussi en utilisant à la place return_next pour chaque ligne renvoyée, comme indiqué précédemment.

  • Lorsque'une session se termine normalement, et pas à cause d'une erreur fatale, tous les blocs END qui ont été définis sont exécutés. Actuellement, aucune autre action ne sont réalisées. Spécifiquement, les descripteurs de fichiers ne sont pas vidés automatiquement et les objets ne sont pas détruits automatiquement.