33.5. Surcharge des fonctions
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. 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,
Conversion de types 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. Rappellez-vous que attribut(table) est
considéré comme équivalent à table.attribut.
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
schema.fonction(table)) mais il est
préférable d'éviter le problème en ne choisissant aucun nom
conflictuel.
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.