Fonction évaluation
contrôle d'un appariement exact dans la catalogue système pg_proc.
recherche le meilleur appariement.
dresse une liste de toutes les fonctions de même nom avec le même nombre d'arguments.
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.
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.
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".
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.
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) |
tgl=> select int4fac(int4(int2 '4')); int4fac ------- 24 (1 row) |
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) |
tgl=> select substr(text(varchar '1234'), 3); substr ------ 34 (1 row) |
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) |
tgl=> select substr(text(1234), 3); substr ------ 34 (1 row) |