PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

chamada de função PostgreSQL


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;