36.6. Sobrecarga de funciones #

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 attribute(table) se considera equivalente a table.attribute. 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, schema.func(table)), pero es mejor evitar el problema no eligiendo nombres en conflicto.

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.