CREATE FUNCTION

Nom

CREATE FUNCTION -- définit une nouvelle fonction

Synopsis

CREATE [ OR REPLACE ] FUNCTION nom
( [ type_arg [, ...] ] )
    RETURNS type_ret
  { LANGUAGE nomlang
    | IMMUTABLE | STABLE | VOLATILE
    | CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT
    | [EXTERNAL] SECURITY INVOKER | [EXTERNAL] SECURITY DEFINER
    | AS 'definition'
    | AS 'fichier_obj', 'symbole_lien'
  } ...
    [ WITH ( attribut [, ...] ) ]

Description

CREATE FUNCTION définit une nouvelle fonction. CREATE OR REPLACE FUNCTION créera une nouvelle fonction ou remplacera une fonction existante.

Si un nom de schéma est inclus, alors la fonction est créée dans le schéma spécifié. Sinon, elle est créée dans le schéma courant. Le nom de la nouvelle fonction ne doit pas correspondre à une autre fonction existante avec les mêmes types d'argument dans le même schéma. Néanmoins, les fonctions de types d'arguments différents pourraient partager un nom (ceci est appelé le surchargement).

Pour mettre à jour la définition d'une fonction existante, utilisez CREATE OR REPLACE FUNCTION. Il n'est pas possible de changer le nom ou les types d'argument d'une fonction de cette façon (si vous avez essayé, vous devrez seulement créer une nouvelle fonction distincte). De même, CREATE OR REPLACE FUNCTION ne vous laissera pas modifier le type en retour d'une fonction existante. Pour cela, vous devez supprimer et recréer la fonction.

Si vous supprimez, puis recréez une fonction, la nouvelle fonction n'est pas la même entité que l'ancienne ; vous casserez les règles, vues, déclencheurs, etc. qui référençaient l'ancienne fonction. Utilisez CREATE OR REPLACE FUNCTION pour modifier la définition d'une fonction sans casser d'objets qui se réfèrent à la fonction.

L'utilisateur qui crée la fonction devient le propriétaire de la fonction.

Paramètres

nom

Le nom d'une fonction à créer.

typearg

Le type de données des arguments de la fonction (qualifié ou non du nom du schéma), s'il y en a. Les types d'argument pourraient être de base, complexe ou des domaines ou copier le type d'une colonne existante.

Le type d'une colonne est référencé en lançant nomtable.nomcolonne%TYPE ; utiliser ceci peut quelque fois vous aider à rendre la fonction indépendante des modifications de la définition d'une table.

Suivant le langage d'implémentation, il pourrait aussi être autorisé de spécifier des << pseudotypes >> plutôt que des cstring. Les pseudotypes indiquent que le type d'argument réel est soit non complètement spécifié, soit en dehors de l'ensemble des types de données ordinaires SQL.

typeret

Le type de données en retour (pouvant être qualifié du nom du schéma). Le type de retour pourrait être un type de base, complexe ou un domaine, ou pourrait être spécifié pour copier le type d'une colonne existante. Voir la description sous typearg ci-dessus pour savoir comment référencer le type d'une colonne existante.

Suivant le langage d'implémentation, il pourrait aussi être autorisé de spécifier un << pseudotype >> tel que cstring. Le modificateur SETOF indique que la fonction renverra un ensemble d'éléments plutôt qu'un seul élément.

nomlang

Le nom du langage dans laquelle la fonction est implémentée. Pourrait être SQL, C, internal ou le nom d'un langage de procédures défini par l'utilisateur. (Voir aussi createlang.) Pour une compatibilité ascendante, le nom peut être englobé avec des guillemets simples.

IMMUTABLE
STABLE
VOLATILE

Ces attributs informent le système s'il est sain de remplacer plusieurs évaluations de la fonction avec une seule évaluation pour une optimisation en exécution. Au plus un choix devra être donné. Si aucun n'apparaît, VOLATILE est la valeur par défaut.

IMMUTABLE indique que la fonction renvoie toujours le même résultat si elle reçoit les mêmes valeurs en argument ; c'est-à-dire qu'elle n'effectue pas de recherches dans la base de données ou, autrement, qu'elle utilise l'information non présente directement dans la liste d'arguments. Si cette option est donnée, tout appel de la fonction avec des arguments constants peut être immédiatement remplacé par la valeur de la fonction.

STABLE indique qu'à l'intérieur d'un seul parcours de la table, la fonction renverra le même résultat pour les mêmes valeurs d'argument, mais son résultat pourrait varier au travers des instructions SQL. Ceci est la sélection appropriée pour les fonctions dont les résultats dépendent des recherches en base de données, des variables paramètres (tel que la zone horaire en cours), etc. Notez aussi que la famille de fonctions current_timestamp est qualifiée de stable car leur valeur ne change pas à l'intérieur d'une transaction.

VOLATILE indique que la valeur de la fonction peut changer même avec un seul parcours de table, donc aucune optimisation ne peut être réalisée. Relativement peu de fonctions de bases de données sont volatiles dans ce sens ; quelques exemples sont random(), currval(), timeofday(). Notez que toute fonction qui a des effets de bord doit être classée comme volatile, même si son résultat est assez prévisible pour empêcher l'optimisation des appels ; un exemple est setval().

CALLED ON NULL INPUT
RETURNS NULL ON NULL INPUT
STRICT

CALLED ON NULL INPUT (la valeur par défaut) indique que la fonction sera appelée normalement quand certains de ses arguments sont NULL. C'est alors de la responsabilité de l'auteur de la fonction de vérifier les valeurs NULL si nécessaire et de répondre en conséquence.

RETURNS NULL ON NULL INPUT ou STRICT indiquent que la fonction renvoie toujours NULL si un de ces arguments est NULL. Si ce paramètre est spécifié, la fonction n'est pas exécutée quand il y a des arguments NULL ; à la place, un résultat NULL est automatiquement renvoyé.

[EXTERNAL] SECURITY INVOKER
[EXTERNAL] SECURITY DEFINER

SECURITY INVOKER indique que la fonction doit être exécutée avec les droits de l'utilisateur qui l'appelle. C'est la valeur par défaut. SECURITY DEFINER spécifie que la fonction doit être exécutée avec les droits de l'utilisateur qui l'a créé.

Le mot clé EXTERNAL est présent pour la conformité SQL mais est optionnelle car, contrairement à SQL, cette fonctionnalité ne s'applique qu'aux fonctions externes.

definition

Une chaîne définissant la fonction ; la signification dépend du langage. Cela pourrait être un nom de fonction interne, le chemin vers un fichier objet, une commande SQL ou un texte dans un langage de procédures.

fichier_obj, symbole_lien

Cette forme de clause AS est utilisée pour les fonctions en langage C chargeables dynamiquement quand le nom de la fonction dans le code source C n'est pas le même que celui de la fonction C. La chaîne fichier_obj est le nom du fichier contenant l'objet chargeable dynamiquement et symbole_lien est le symbole de lien de la fonction, c'est-à-dire le nom de la fonction dans le code source C. Si ce lien est omis, il est supposé être le même que le nom de la fonction en cours de définition.

attribut

La façon historique de spécifier les morceaux optionnels d'informations sur la fonction. Les attributs suivants pourraient apparaître ici :

isStrict

Équivalent à STRICT ou RETURNS NULL ON NULL INPUT

isCachable

isCachable est un équivalent obsolète de IMMUTABLE ; il est toujours accepté pour des raisons de compatibilité ascendante.

Les noms d'attribut ne sont pas sensibles à la casse.

Notes

Référez-vous à Section 33.3 pour plus d'informations sur l'écriture de fonctions.

La syntaxe complète de type SQL est autorisée pour les arguments en entrée et pour la valeur de sortie. Néanmoins, quelques détails de spécification de type (c'est-à-dire le champ précision pour le type numeric) sont de la responsabilité de l'implémentation de la fonction sous-jacente et sont silencieusement avalés (c'est-à-dire non reconnus ou forcés) par la commande CREATE FUNCTION.

PostgreSQL autorise le surchargement de fonctions ; c'est-à-dire que le même nom peut être utilisé pour plusieurs fonctions différentes si tant est qu'elles ont des types d'arguments distincts. Néanmoins, les noms C de toutes les fonctions doivent être différents, donc vous devez donner des noms différentes aux fonctions C suchargées (par exemple, utilisez les types d'argument comme morceaux des noms des fonctions C).

Lors d'appels répétés à CREATE FUNCTION et se référant au même fichier objet, le fichier est chargé une seule fois. Pour décharger et recharger le fichier (peut-être pendant le développement), utilisez la commande LOAD.

Utilisez DROP FUNCTION pour supprimer les fonctions définies par l'utilisateur.

Tout guillemet simple ou antislash dans la définition de la fonction doit être échappé en le doublant.

Pour être capable de définir une fonction, l'utilisateur doit avoir le droit USAGE sur le langage.

Exemples

Voici un exemple trivial pour vous aider à commencer. Pour plus d'informations et d'exemples, voir Section 33.3.

CREATE FUNCTION add(integer, integer) RETURNS integer
    AS 'select $1 + $2;'
    LANGUAGE SQL
    IMMUTABLE
    RETURNS NULL ON NULL INPUT;

Écrire des fonctions SECURITY DEFINER en toute sécurité

Comme une fonction SECURITY DEFINER est exécutée avec les droits de l'utilisateur qui l'a créé, une certaine attention est nécessaire pour s'assurer que la fonction ne peut pas être utilisée de façon maline. Pour des raisons de sécurité, search_path doit être configuré pour exclure tout schéma où des utilisateurs qui ne sont pas de confiance pourraient écrire. Ceci empêche des utilisateurs malveillants de créer des objets qui masqueraient des objets utilisés par la fonction. Dans cette idée, le schéma des tables temporaires est particulièrement important car il est le premier schéma dans lequel a lieu la recherche et il est modifiable par tout utilisateur. Une solution est de forcer la recherche à ne prendre en condition ce schéma qu'en dernier lieu. Pour cela, écrire pg_temp en tant que dernière entrée de search_path. La fonction suivante illustre une utilisation sûre :

CREATE FUNCTION verifie_motdepasse(unom TEXT, motpasse TEXT)
RETURNS BOOLEAN AS $$
DECLARE ok BOOLEAN;
        ancien_path TEXT;
BEGIN
        -- Sauvegarder l'ancien search_path ;
        -- remarquez que nous devons qualifier current_setting
        -- pour nous assurer que nous appelons la bonne fonction
        ancien_path := pg_catalog.current_setting('search_path');

        -- Configurer un search_path sécurisé : schémas de confiance, puis 'pg_temp'.
        -- Nous initialisons is_local = true pour que l'ancienne valeur
        -- soit restaurée au cas où une erreur survienne avant que nous
        -- n'atteignons la fin de la fonction.
        PERFORM pg_catalog.set_config('search_path', 'admin, pg_temp', true);

        -- Effectuer le travail sécurisé de la fonction.
        SELECT  (motdepasse = $2) INTO ok
        FROM    motsdepasse
        WHERE   nomutilisateur = $1;

        -- Restaurer le search_path de l'appelant
        PERFORM pg_catalog.set_config('search_path', ancien_path, true);

        RETURN ok;
END;
$$ LANGUAGE plpgsql SECURITY DEFINER;

Compatibilité

Une commande CREATE FUNCTION est définie en SQL99. La version PostgreSQL est similaire mais pas entièrement compatible. Les attributs ne sont pas portables, pas plus que les différents langages disponibles.

Voir aussi

ALTER FUNCTION, DROP FUNCTION, GRANT, LOAD, REVOKE, createlang