33.8. Surcharge de fonction

On peut définir plus d'une fonction avec le même nom SQL, à condition qu'elles acceptent des arguments 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 quelle fonction appeler en fonction du type de données et du nombre d'arguments fournis. La surcharge peut aussi être utilisée pour simuler des fonctions avec un nombre variable d'arguments, jusqu'à un nombre maximum fini.

Une fonction peut aussi avoir le même nom qu'un attribut. (Rappelez-vous que attribute(table) est équivalent à table.attribute.) Dans le cas où il y a une ambiguïté entre une fonction opérant sur un type complexe et un des attributs du type complexe, l'attribut sera toujours utilisé.

Quand nous créons une famille de fonctions surchargées, il faut être attentif à ne pas créer d'ambiguités. Par exemple, pour les fonctions

CREATE FUNCTION test(int, real) RETURNS ...
CREATE FUNCTION test(smallint, double precision) RETURNS ...

il n'est pas évident au premier abord de déterminer quelle fonction sera appelée par une entrée telle que test(1, 1.5). Les règles de résolution implémentées actuellement sont décrites dans le Chapitre 10 mais il est peu judicieux de concevoir un système qui repose sur un comportement aussi subtil.

Il existe une contrainte supplémentaire quand nous surchargeons une fonction C : le nom C de chaque fonction de la famille des fonctions surchargées doit être différent des noms C de toutes les autres fonctions, internes ou chargées dynamiquement. Si cette règle est violée, le comportement n'est pas portable. Vous pouvez avoir une erreur ou bien une des fonctions sera appelée (habituellement la fonction interne). La forme alternative de la clause AS de la commande SQL CREATE FUNCTION dissocie le nom SQL de la fonction 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.