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.