Det bestäms av reglerna för Funktionstypupplösning . Detaljerad förklaring i manualen. Relaterat:
- Finns det något sätt att inaktivera funktionsöverbelastning i Postgres
NULL utan explicit typ cast börjar som typen "okänt":
SELECT pg_typeof(NULL)
pg_typeof
-----------
unknown
Faktiskt Jag blev misstänksam och körde ett snabbtest, bara för att hitta olika resultat i Postgres 9.3 och 9.4. varchar
väljs över integer
(vilket märkligt nog motsäger dina upptäckter):
SQL-fiol.
Jag skulle tro att enligt regeln är punkt 4e i listan (ingen av de tidigare punkterna avgör matchen):
Vid varje position, välj strängkategori om någon kandidat accepterar den kategorin. (Denna förspänning mot sträng är lämplig eftersom en bokstavlig bokstav av okänd typ ser ut som en sträng.)
Om du har lagt till en annan funktion med inmatningstyp text
till den överbelastade mixen, text
skulle väljas över varchar
.
Personligen har jag nästan alltid använd text
istället för varchar
. Samtidigt som den är binärkompatibel (så nästan men inte riktigt samma), text
ligger närmare Postgres hjärta i alla avseenden.
Jag lade till det i fiolen, liksom ett annat exempel där Postgres inte kan bestämma sig och kastar ut raserianfall.
Om du vill välja en viss funktion, lägg till en explicit typ av rollbesättning (det är vägen att gå här!):
select test(null::int) AS func_int
, test(null::varchar) AS func_vc;