Sobrecarga de funciones

Se puede definir más de una función con el mismo nombre, siempre que los argumentos que tomen sean diferentes. En otras palabras, los nombres de las funciones se pueden sobrecargar. Una función puede tener además el mismo nombre que un atributo. En el caso de que haya ambigüedad entre una función sobre un tipo complejo y un atributo del tipo complejo, se usará siempre el atributo.

Conflictos en el Espacio de Nombres

A partir de Postgres v6.6, la forma alternativa de la cláusula AS para la orden de SQL CREATE FUNCTION desempareja el nombre de la función SQL del nombre de función en el código fuente C. Esta es ahora la técnica preferida para realizar la sobrecarga de funciones.

Pre-v6.6

Para funciones escritas en C, el nombre SQL declarado en CREATE FUNCTION debe ser exactamente el mismo que el nombre real de la función en el código C (debido a esto debe ser un nombre de función de C legal).

Hay una sutil consecuencia de este restricción: mientras las rutinas de carga dinámicas en la mayoría de los sistemas operativos están mas que felices de permitirle cargar cualquier número de librerías compartidas que contienen nombres de funciones conflictivos (con idénticos nombres), pueden, de hecho, chapucear la carga de formas interesantes. Por ejemplo, si usted define una función dinámicamente cargada que resulta tener el mismo nombre que una función perteneciente a Postgres, el cargador DEC OSF/1 dinámico hace que Postgres llame a la función dentro de él mismo preferiblemente a dejar que Postgres llame a su función. Por esto, si quiere que su función se use en diferentes arquitecturas, recomendamos que no sobrecargue los nombres de las funciones C.

Hay un truco ingenioso para resolver el problema que se acaba de describir. Dado que no hay problemas al sobrecargar funciones SQL, usted puede definir un conjunto de funciones C con nombres diferentes y entonces definir un conjunto de funciones SQL con idénticos nombres que tomen los tipos de argumentos apropiados y llamen a la función C correspondiente.

Otra solución es no usar la carga dinámica, sino enlazar sus funciones al backend státicamente y declararlas como funciones INTERNAL. Entonces, las funciones deben tener todas nombres C distintos pero se pueden declarar con los mismos nombres SQL (siempre que los tipos de sus argumentos difieran, por supuesto). Esta forma evita la sobrecarga de una función wrapper (o envolvente) SQL, con la desventaja de un mayor esfuerzo para preparar un ejecutable del backend a medida. (Esta opción está disponible sólo en la versión 6.5 y posteriores, dado que las versiones anteriores requerían funciones internas para tener el mismo nombre en SQL que en el código C.)