10.3. Fonctions

La fonction sp�cifique � utiliser dans une invocation de fonctions est d�termin�e selon les �tapes suivantes.

R�solution de types pour les fonctions

  1. S�lectionner les fonctions � examiner depuis le catalogue syst�me pg_proc. Si un nom non-qualifi� de fonction �tait utilis�, les fonctions examin�es sont celles avec un nom et un nombre d'arguments corrects et qui sont visibles dans le chemin de recherche courant (regardez la Section 5.8.3). Si un nom qualifi� de fonctions a �t� donn�, seules les fonctions dans le sch�ma sp�cifique sont examin�es.

    1. Si un chemin de recherche trouve de nombreuses fonctions avec des types d'arguments identiques, seule celle apparaissant le plus t�t dans le chemin sera examin�e. Mais les fonctions avec des types d'arguments diff�rents sont examin�es sur une base d'�galit� ind�pendamment de leur position dans le chemin de recherche.

  2. V�rifier que la fonction accepte le type exact des arguments en entr�e. Si une fonction existe (il peut en avoir uniquement une qui corresponde exactement dans l'ensemble des fonctions consid�r�es), utiliser cette fonction. (Les cas impliquant le type inconnu ne trouveront jamais de correspondance � cette �tape.)

  3. Si aucune correspondance n'est trouv�e, regarder si l'appel � la fonction appara�t �tre une requ�te triviale de conversion de types. Cela arrive si l'appel � la fonction a juste un argument et si le nom de la fonction est le m�me que le nom (interne) de certains types de donn�es. De plus, l'argument de la fonction doit �tre soit un type inconnu soit un type qui a une compatibilit� binaire avec le type de donn�es nomm�s. Quand ces conditions sont r�unies, l'argument de la fonction est converti vers le type de donn�es nomm� sans aucun appel effectif � la fonction.

  4. Regarder pour la meilleure correspondance.

    1. Se d�barrasser des fonctions candidates pour lesquelles les types en entr�e ne correspondent pas et qui ne peuvent pas �tre convertis (en utilisant une conversion implicite) pour correspondre. Le type inconnu est suppos� �tre convertible vers n'importe quoi. Si seulement un candidat reste, utiliser le, sinon aller � la prochaine �tape.

    2. Parcourir tous les candidats et garder ceux avec la correspondance la plus exacte par rapport aux types en entr�e. (Les domaines sont consid�r�s de la m�me fa�on que leur type de base pour cette �tape.) Garder tous les candidats si aucun n'a de correspondances exactes. Si seulement un candidat reste, utiliser le ; sinon aller � la prochaine �tape.

    3. Parcourir tous les candidats et garder ceux qui acceptent les types pr�f�r�s (de la cat�gorie des types de donn�es en entr�e) aux positions o� la conversion de types aurait �t� requise. Garder tous les candidats si aucun n'accepte les types pr�f�r�s. Si seulement un candidat reste, utiliser le ; sinon aller � la prochaine �tape.

    4. Si des arguments en entr�e sont inconnu, v�rifier les cat�gories de types accept�es � la position de ces arguments par les candidats restants. � chaque position, s�lectionner la cat�gorie cha�ne de caract�res si un des candidats accepte cette cat�gorie. (Cette tendance envers les cha�nes de caract�res est appropri�e depuis que le terme type-inconnu ressemble � une cha�ne de caract�res.) Dans le cas contraire, si tous les candidats restants acceptent la m�me cat�gorie de types, s�lectionner cette cat�gorie. Dans le cas contraire �chouer car le choix correct ne peut pas �tre d�duit sans plus d'indices. Se d�barrasser maintenant des candidats qui n'acceptent pas la cat�gorie s�lectionn�e. De plus, si des candidats acceptent un type pr�f�r� comme argument donn�, se d�barrasser des candidats qui acceptent, pour cet argument, les types qui ne sont pas pr�f�r�s.

    5. Si seulement un candidat reste, utiliser le. Si aucun candidat ou si plus d'un candidat reste, alors �chouer.

Notez que les r�gles de <<�correspondance optimale�>> sont identiques pour la r�solution de types concernant les op�rateurs et les fonctions. Quelques exemples suivent.

Exemple 10-4. R�solution de types pour les arguments de la fonction arrondie

Il n'existe qu'une seule fonction round avec deux arguments. (Le premier est un num�rique, le second est un entier. Ainsi, la requ�te suivante convertie automatiquement le type du premier argument de entier vers num�rique.

SELECT round(4, 4);

 round
--------
 4.0000
(1 row)

La requ�te est en fait transform�e par l'analyseur en

SELECT round(CAST (4 AS numeric), 4);

Puisque le type num�rique est initialement assign� aux constantes num�riques avec un point d�cimal, la requ�te suivante ne requi�rera pas une conversion de types et pourra par cons�quent �tre un peu plus efficace :

SELECT round(4.0, 4);

Exemple 10-5. R�solution de types pour les fonctions retournant un segment de cha�ne

Il existe plusieurs fonctions substr, une d'entre elles prend les types texte et entier. Si cette fonction est appel�e avec une constante de cha�nes d'un type inconnu, le syst�me choisi la fonction candidate qui accepte un argument issu de la cat�gorie pr�f�r�e cha�nes (c'est-�-dire de type texte).

SELECT substr('1234', 3);

 substr
--------
     34
(1 row)

Si la cha�ne de caract�res est d�clar�e comme �tant du type varchar (cha�ne de caract�res de longueur variable), ce qui peut �tre le cas si elle vient d'une table, alors l'analyseur essayera de la convertir en texte :

SELECT substr(varchar '1234', 3);

 substr
--------
     34
(1 row)

Ceci est transform� par l'analyseur pour efficacement devenir

SELECT substr(CAST (varchar '1234' AS text), 3);

Note�: L'analyseur apprend depuis le catalogue pg_cast que les types texte et varchar ont une compatibilit� binaire, ce qui veut dire que l'un peut �tre pass� � une fonction qui accepte l'autre sans avoir � faire aucune conversion physique. Par cons�quent, aucun appel de conversion explicite de types n'est r�ellement ins�r� dans ce cas.

Et si la fonction est appel�e avec un argument de type entier, l'analyseur essayera de le convertir en texte :

SELECT substr(1234, 3);

 substr
--------
     34
(1 row)

Ceci est en fait ex�cut� de la fa�on suivante :

SELECT substr(CAST (1234 AS text), 3);

Cette transformation automatique peut r�ussir parce qu'il y a une invocation de conversion implicite du type entier vers le type texte.