Ciò è deciso dalle regole di Risoluzione del tipo di funzione . Spiegazione dettagliata nel manuale. Correlati:
- C'è un modo per disabilitare il sovraccarico delle funzioni in Postgres
NULL senza il cast di tipo esplicito inizia come tipo "sconosciuto":
SELECT pg_typeof(NULL)
pg_typeof
-----------
unknown
In realtà, Mi sono insospettito ed ho eseguito un rapido test, solo per trovare risultati diversi in Postgres 9.3 e 9.4. varchar
viene selezionato su integer
(che stranamente contraddice le tue scoperte):
SQL Fiddle.
Penso che la regola corrispondente sia il punto 4e nell'elenco (nessuno dei punti precedenti decide la corrispondenza):
In ogni posizione, seleziona la categoria della stringa se un candidato accetta quella categoria. (Questa tendenza verso la stringa è appropriata poiché un valore letterale di tipo sconosciuto sembra una stringa.)
Se hai aggiunto un'altra funzione con il tipo di input text
al mix sovraccarico, text
verrebbe selezionato su varchar
.
Personalmente io quasi sempre usa text
invece di varchar
. Pur essendo compatibile con i binari (quindi quasi ma non proprio uguale), text
è più vicino al cuore di Postgres sotto ogni aspetto.
L'ho aggiunto al violino, così come un altro esempio in cui Postgres non riesce a decidere e fa i capricci.
Se vuoi scegliere una funzione particolare, aggiungi un cast di tipo esplicito (questo è il modo di andare qui!):
select test(null::int) AS func_int
, test(null::varchar) AS func_vc;