Il existe plusieurs fonctions substr,
une d'entre elles prend les types text
et integer. 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 string
(c'est-à-dire de type text).
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 text :
SELECT substr(varchar '1234', 3);
substr
--------
34
(1 row)
Ceci est transformé par l'analyseur en
SELECT substr(CAST (varchar '1234' AS text), 3);
Note
L'analyseur apprend depuis le catalogue pg_cast que les types text 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
integer, l'analyseur essaie de le
convertir en text :
SELECT substr(1234, 3);
substr
--------
34
(1 row)
Ceci est réellement 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 un
appel de conversion implicite du type integer vers le type text.