Cela est décidé par les règles de Function Type Resolution . Explication détaillée dans le manuel. Connexe :
- Existe-t-il un moyen de désactiver la surcharge de fonctions dans Postgres
NULL sans conversion de type explicite commence par le type "inconnu":
SELECT pg_typeof(NULL)
pg_typeof
-----------
unknown
En fait, Je me suis méfié et j'ai effectué un test rapide, juste pour trouver des résultats différents dans Postgres 9.3 et 9.4. varchar
est sélectionné sur integer
(qui curieusement contredit vos conclusions):
SQL Fiddle.
Je pense que la règle correspondante est le point 4e de la liste (aucun des points précédents ne décide du match) :
À chaque position, sélectionnez la catégorie de chaîne si un candidat accepte cette catégorie. (Ce biais vers la chaîne est approprié car un littéral de type inconnu ressemble à une chaîne.)
Si vous avez ajouté une autre fonction avec le type d'entrée text
au mix surchargé, text
serait choisi sur varchar
.
Personnellement, je presque toujours utiliser text
au lieu de varchar
. Tout en étant compatible binaire (donc presque mais pas tout à fait pareil), text
est plus proche du cœur de Postgres à tous égards.
J'ai ajouté cela au violon, ainsi qu'un autre exemple où Postgres ne peut pas décider et fait une crise de colère.
Si vous voulez choisir une fonction particulière, ajoutez un cast de type explicite (c'est la voie à suivre ici !) :
select test(null::int) AS func_int
, test(null::varchar) AS func_vc;