Det bestemmes af reglerne for Opløsning af funktionstype . Detaljeret forklaring i manualen. Relateret:
- Er der en måde at deaktivere funktionsoverbelastning i Postgres
NULL uden eksplicit type cast starter som typen "ukendt":
SELECT pg_typeof(NULL)
pg_typeof
-----------
unknown
Faktisk Jeg blev mistænksom og kørte en hurtig test, bare for at finde forskellige resultater i Postgres 9.3 og 9.4. varchar
er valgt over integer
(hvilket mærkeligt nok modsiger dine resultater):
SQL Fiddle.
Jeg vil tro, at reglen er punkt 4e på listen (ingen af de tidligere punkter afgør kampen):
Ved hver stilling skal du vælge strengkategorien, hvis en kandidat accepterer den kategori. (Denne skævhed mod streng er passende, da en bogstavlig af ukendt type ligner en streng.)
Hvis du tilføjede en anden funktion med input, skriv text
til den overbelastede blanding, text
ville blive valgt over varchar
.
Personligt er jeg næsten altid brug text
i stedet for varchar
. Selvom det er binært kompatibelt (så næsten, men ikke helt det samme), text
ligger tættere på Postgres' hjerte i enhver henseende.
Det tilføjede jeg til violinen, samt et andet eksempel, hvor Postgres ikke kan bestemme sig og kaster raserianfald.
Hvis du vil vælge en bestemt funktion, skal du tilføje en eksplicit type cast (det er vejen at gå her!):
select test(null::int) AS func_int
, test(null::varchar) AS func_vc;