A função específica a ser utilizada em uma chamada de função é determinada de acordo com os seguintes passos.
Resolução do tipo em função
pg_proc
as funções a serem consideradas. Se for utilizado um nome de função não qualificado, as funções consideradas são aquelas com nome e número de argumentos corretos, visíveis no caminho de procura corrente (veja a
Seção 5.8.3
). Se for fornecido um nome de função qualificado, somente são consideradas as funções no esquema especificado.
Deve ser observado que as regras da "melhor correspondência" são idênticas para a resolução do tipo em operador e função. Seguem alguns exemplos.
Exemplo 10-4. Resolução do tipo do argumento em função de arredondamento
Existe apenas uma função round
com dois argumentos (O primeiro é numeric e o segundo é integer). Portanto, a consulta abaixo converte automaticamente o primeiro argumento do tipo integer para numeric:
=> SELECT round(4, 4); round -------- 4.0000 (1 linha)
Na verdade esta consulta é convertida pelo analisador em
=> SELECT round(CAST (4 AS numeric), 4);
Uma vez que inicialmente é atribuído o tipo numeric às constantes numéricas com ponto decimal, a consulta abaixo não necessita de conversão de tipo podendo, portanto, ser ligeiramente mais eficiente:
=> SELECT round(4.0, 4);
Exemplo 10-5. Resolução do tipo em função de subcadeia de caracteres
Existem diversas funções substr
, uma das quais aceita os tipos text e integer. Se esta função for chamada com uma constante cadeia de caracteres de tipo não especificado, o sistema escolhe a função candidata que aceita o argumento da categoria preferida para string (que é o tipo text).
=> SELECT substr('1234', 3); substr -------- 34 (1 linha)
Se a cadeia de caracteres for declarada como sendo do tipo varchar, o que pode ser o caso se vier de uma tabela, então o analisador tenta converter para torná-la do tipo text:
=> SELECT substr(varchar '1234', 3); substr -------- 34 (1 linha)
Esta consulta é transformada pelo analisador para se tornar efetivamente:
=> SELECT substr(CAST (varchar '1234' AS text), 3);
Nota: O analisador descobre no catálogo pg_cast que os tipos text e varchar são binariamente compatíveis, significando que um pode ser passado para uma função que aceita o outro sem realizar qualquer conversão física. Portanto, neste caso, não é realmente inserida nenhuma chamada de conversão de tipo explícita.
E, se a função for chamada com um argumento do tipo integer, o analisador tentará convertê-lo em text:
=> SELECT substr(1234, 3); substr -------- 34 (1 linha)
Na verdade é executado como:
=> SELECT substr(CAST (1234 AS text), 3);
Esta transformação automática pode ser feita, porque existe uma conversão implícita de integer para text que pode ser chamada.