Plusieurs fonctions peuvent être définies avec le même nom SQL à condition que les arguments soient différents. En d'autres termes, les noms de fonction peuvent être surchargés. Que vous l'utilisiez ou non, cette possibilité implique des précautions au niveau de la sécurité lors de l'appel de fonctions dans les bases de données où certains utilisateurs ne font pas confiance aux autres utilisateurs ; voir Section 10.3. Quand une requête est exécutée, le serveur déterminera la fonction à appeler à partir des types de données des arguments et du nombre d'arguments. La surcharge peut aussi être utilisée pour simuler des fonctions avec un nombre variable d'arguments jusqu'à un nombre maximum fini.
Lors de la création d'une famille de fonctions surchargées, vous devriez être attentif à ne pas créer d'ambiguïtés. Par exemple, avec les fonctions :
CREATE FUNCTION test(int, real) RETURNS ... CREATE FUNCTION test(smallint, double precision) RETURNS ...
Savoir quelle fonction sera appelée avec une entrée triviale comme
test(1, 1.5)
n'est pas immédiatement clair. Les
règles de résolution actuellement implémentées sont décrites dans le
Chapitre 10 mais il est déconseillé de concevoir un
système qui serait basé subtilement sur ce comportement.
Une fonction qui prend un seul argument d'un type composite devrait
généralement ne pas avoir le même nom que tout attribut (champ) de
ce type. Rappelez-vous que
est
considéré comme équivalent à attribut
(table
)
. Dans
le cas où il existe une ambiguïté entre une fonction sur un type
composite et sur un attribut d'un type composite, l'attribut sera
toujours utilisé. Il est possible de contourner ce choix en
qualifiant le nom de la fonction avec celui du schéma (c'est-à-dire
table
.attribut
)
mais il est préférable d'éviter le problème en ne choisissant aucun nom
conflictuel.
schema
.fonction
(table
)
Un autre conflit possible se trouve entre les fonctions variadic et les
autres. En fait, il est possible de créer à la fois
foo(numeric)
et foo(VARIADIC numeric[])
.
Dans ce cas, il n'est pas simple de savoir lequel sera sélectionné lors
d'un appel avec un seul argument numérique, par exemple
foo(10.1)
. La règle est que la fonction apparaissant
plus tôt dans le chemin des schémas est utilisé. De même, si les deux
fonctions sont dans le même schéma, la non variadic est préféré.
Lors de la surcharge de fonctions en langage C, il existe une
contrainte supplémentaire : le nom C de chaque fonction dans la
famille des fonctions surchargées doit être différent des noms C de
toutes les autres fonctions, soit internes soit chargées dynamiquement
Si cette règle est violée, le comportement n'est pas portable. Vous
pourriez obtenir une erreur de l'éditeur de lien ou une des fonctions
sera appelée (habituellement l'interne). L'autre forme de clause
AS
pour la commande SQL CREATE
FUNCTION
découple le nom de la fonction SQL à partir du
nom de la fonction dans le code source C. Par exemple :
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;
Les noms des fonctions C reflètent ici une des nombreuses conventions possibles.