Fonctions

Fonction évaluation

  1. contrôle d'un appariement exact dans la catalogue système pg_proc.

  2. recherche le meilleur appariement.

    1. dresse une liste de toutes les fonctions de même nom avec le même nombre d'arguments.

    2. si une seule fonction est dans la liste, utilise celle-ci si les types entrée peuvent être contraints, et retourne une erreur si les types ne peuvent pas être contraints.

    3. garde toutes les fonctions avec le meilleur appariement pour les types. Garde tout s'il n'y a pas d'appariements explicites et passe à l'étape suivante. Si il reste seulement un candidat, il est utilisé si le type peut être contraint.

    4. si certains arguments entrée sont "inconnu", catégorise les candidats entrée comme boolean, string, geometric ou user. Si il y a un mélange de catégories, ou plus d'un type utilisateur, retourne une erreur parce que le choix correct ne peut pas être déduit sans plus d'informations. Si seulement une catégorie est présente, assigne le type préférentiel à la colonne input qui était antérieurement "inconnu".

    5. choisi le candidat avec les types d'appariements les plus exacts, et apparie le type préférentiel pour chaque catégorie de colonne depuis l'étape précédente. Si il y a encore plus d'un candidat, ou si il n'y en a plus, retourne alors une erreur.

Exemples

Fonction factorielle

Il y a seulement une fonction factorielle définie dans le catalogue pg_proc. Les requêtes suivantes convertissent automatiquement l'argument int2 en int4 :
tgl=> select int4fac(int2 '4');
int4fac
-------
     24
(1 row)
et est actuellement transformé par le parser en
tgl=> select int4fac(int4(int2 '4'));
int4fac
-------
     24
(1 row)

Fonction substring

Il y a deux fonctions substr déclarées dans pg_proc. Cependant, une seule prend deux arguments, de type text et int4.

Si il est appelé avec une constante chaîne de type non spécifié, le type est apparié directement avec la seule fonction type candidat :
tgl=> select substr('1234', 3);
substr
------
    34
(1 row)

si la chaîne est déclarée de type varchar, ce qui peut être le cas si elle provient d'une table, le parser essaiera de contraindre en text :
tgl=> select substr(varchar '1234', 3);
substr
------
    34
(1 row)
lequel est transformé par le parser pour devenir
tgl=> select substr(text(varchar '1234'), 3);
substr
------
    34
(1 row)

Note

il existe certaines fonctionnalités dans le parser pour optimiser les relations entre les types char, varchar et text. Dans ce cas substr est appelé directement avec la chaîne varchar plutôt que d'insérer un appel conversion explicite.

Et, si la fonction est appelée avec un int4, le parser essaiera de convertir en text :
tgl=> select substr(1234, 3);
substr
------
    34
(1 row)
exécuté comme
tgl=> select substr(text(1234), 3);
substr
------
    34
(1 row)