Isso é decidido pelas regras de Resolução de tipo de função . Explicação detalhada no manual. Relacionado:
- Existe uma maneira de desativar a sobrecarga de funções no Postgres
NULL sem conversão de tipo explícito começa como tipo "desconhecido":
SELECT pg_typeof(NULL)
pg_typeof
-----------
unknown
Na verdade, Fiquei desconfiado e fiz um teste rápido, só para encontrar resultados diferentes no Postgres 9.3 e 9.4.
varchar
é escolhido sobre integer
(que estranhamente contradiz suas descobertas):SQL Fiddle.
Eu acho que a regra de acordo é o ponto 4e na lista (nenhum dos pontos anteriores decide a partida):
Em cada posição, selecione a categoria de string se algum candidato aceitar essa categoria. (Esse viés para string é apropriado, pois um literal de tipo desconhecido se parece com uma string.)
Se você adicionou outra função com o tipo de entrada
text
ao mix sobrecarregado, text
seria escolhido sobre varchar
. Pessoalmente eu quase sempre use
text
em vez de varchar
. Apesar de ser compatível com binário (tão quase, mas não exatamente o mesmo), text
está mais próximo do coração do Postgres em todos os aspectos. Eu adicionei isso ao violino, bem como outro exemplo em que o Postgres não pode decidir e faz birra.
Se você quiser escolher uma função específica, adicione uma conversão de tipo explícito (essa é a maneira de ir aqui!):
select test(null::int) AS func_int
, test(null::varchar) AS func_vc;