Puedes definir más de una función con el mismo nombre SQL, siempre y cuando los argumentos que reciban sean diferentes. En otras palabras, los nombres de las funciones se pueden sobrecargar. Utilices o no esta capacidad, la misma conlleva precauciones de seguridad al invocar funciones en bases de datos donde algunos usuarios desconfían de otros; consulta la Section 10.3. Cuando se ejecuta una consulta, el servidor determinará qué función invocar a partir de los tipos de datos y la cantidad de los argumentos proporcionados. La sobrecarga también se puede utilizar para simular funciones con un número variable de argumentos, hasta un máximo finito.
Al crear una familia de funciones sobrecargadas, debes tener cuidado de no crear ambigüedades. Por ejemplo, dadas las funciones:
CREATE FUNCTION test(int, real) RETURNS ... CREATE FUNCTION test(smallint, double precision) RETURNS ...
no queda inmediatamente claro qué función se invocaría con una entrada trivial
como test(1, 1.5). Las reglas de resolución implementadas
actualmente se describen en la Chapter 10, pero no es recomendable
diseñar un sistema que dependa sutilmente de este comportamiento.
Una función que toma un único argumento de un tipo compuesto generalmente no
debería tener el mismo nombre que cualquier atributo (campo) de ese tipo.
Recuerda que
se considera equivalente a
attribute(table).
En caso de que exista una ambigüedad entre una función en un tipo compuesto
y un atributo del tipo compuesto, siempre se utilizará el atributo. Es posible
desactivar esta elección calificando el nombre de la función con el esquema
(es decir, table.attribute),
pero es mejor evitar el problema no eligiendo nombres en conflicto.
schema.func(table)
Otro posible conflicto es entre funciones variádicas y no variádicas.
Por ejemplo, es posible crear tanto foo(numeric) como
foo(VARIADIC numeric[]). En este caso, no está claro cuál
debería coincidir con una llamada que proporciona un solo argumento numérico,
como foo(10.1). La regla es que se utiliza la función que
aparece antes en la ruta de búsqueda (search path), o si las dos funciones
están en el mismo esquema, se prefiere la no variádica.
Al sobrecargar funciones en lenguaje C, existe una restricción adicional:
el nombre en C de cada función en la familia de funciones sobrecargadas
debe ser diferente de los nombres en C de todas las demás funciones, ya
sean internas o cargadas dinámicamente. Si se viola esta regla, el comportamiento
no es portable. Podrías obtener un error del enlazador en tiempo de ejecución, o
se llamará a una de las funciones (normalmente la interna). La forma alternativa
de la cláusula AS para el comando SQL CREATE FUNCTION
desacopla el nombre de la función SQL del nombre de la función en el código fuente C.
Por ejemplo:
CREATE FUNCTION test(int) RETURNS int
AS 'filename', 'test_1arg'
LANGUAGE C;
CREATE FUNCTION test(int, int) RETURNS int
AS 'filename', 'test_2arg'
LANGUAGE C;
Los nombres de las funciones C aquí reflejan una de las muchas convenciones posibles.