36.6. Sobrecarga de função #

Pode ser definida mais de uma função SQL com o mesmo nome, desde que os argumentos sejam diferentes. Em outras palavras, os nomes das funções podem ser sobrecarregados. Independentemente de ser usado ou não, este recurso cria a necessidade de se tomar precauções ao chamar funções em bancos de dados onde alguns usuários não confiam em outros usuários; veja Funções. Quando uma consulta é executada, o servidor determina qual função será chamada a partir dos tipos de dados e o número de argumentos fornecidos. A sobrecarga também pode ser usada para simular funções com número variável de argumentos, até um número máximo finito.

Ao criar uma família de funções sobrecarregadas, deve-se ter o cuidado de não criar ambiguidades. Por exemplo, dada as funções

CREATE FUNCTION test(int, real) RETURNS ...
CREATE FUNCTION test(smallint, double precision) RETURNS ...

não fica logo claro qual é função a ser chamada com alguma entrada trivial, como test(1, 1.5). As regras de resolução atualmente implementadas são descritas em Conversão de tipo de dados, mas não se recomenda projetar um sistema que dependa das sutilezas desse comportamento.

Uma função que recebe um único argumento de tipo de dados composto, geralmente não deve ter o mesmo nome de nenhum atributo (campo) desse tipo de dados. Lembre-se que atributo(tabela) é considerado equivalente à tabela.atributo. Havendo ambiguidade entre uma função de tipo de dados composto e um atributo do tipo de dados composto, sempre será usado o atributo. É possível mudar esta escolha qualificando o nome da função com o esquema (ou seja, esquema.função(tabela)), mas é melhor evitar este problema não escolhendo nomes conflitantes.

Outro possível conflito se dá entre funções variádicas e não-variádicas. Por exemplo, é possível criar foo(numeric) e foo(VARIADIC numeric[]). Neste caso, não fica claro qual das duas deve corresponder a uma chamada fornecendo um único argumento numérico, como foo(10.1). A regra é que a função que aparece primeiro no caminho de procura é a função usada ou, se as duas funções estiverem no mesmo esquema, a função não variádica é a preferida.

Ao sobrecarregar funções na linguagem C, há uma restrição adicional: o nome de cada função C, na família de funções sobrecarregadas, deve ser diferente dos nomes de todas as outras funções C, internas ou carregadas dinamicamente. Se esta regra for violada, o comportamento não será portável. Pode acontecer um erro do vinculador em tempo de execução, ou uma das funções ser chamada (geralmente a interna). A forma alternativa da cláusula AS para o comando SQL CREATE FUNCTION separa o nome da função SQL do nome da função no código-fonte C. Por exemplo:

CREATE FUNCTION test(int) RETURNS int
    AS 'nome_do_arquivo', 'test_1arg'
    LANGUAGE C;
CREATE FUNCTION test(int, int) RETURNS int
    AS 'nome_do_arquivo', 'test_2arg'
    LANGUAGE C;

Os nomes das funções C acima refletem uma das muitas convenções possíveis.