PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Appel de fonction PostgreSQL

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;