Documentation PostgreSQL 7.4.29 | ||||
---|---|---|---|---|
Pr�c�dent | Arri�re rapide | Chapitre 10. Conversion de types | Avance rapide | Suivant |
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
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.
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.
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.)
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.
Regarder pour la meilleure correspondance.
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.
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.
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.
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.
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.
Pr�c�dent | Sommaire | Suivant |
Op�rateurs | Niveau sup�rieur | Stockage de valeurs |