33.12. Opérateurs définis par l'utilisateur
chaque opérateur est un « sucre
syntaxique » pour l'appel d'une fonction sous-jacente qui
effectue le véritable travail ; aussi devez-vous en premier lieu
créer cette fonction avant de pouvoir créer l'opérateur. Toutefois,
un opérateur n'est pas
simplement
un « sucre syntaxique » car il apporte des
informations supplémentaires qui aident le planificateur de requête à
optimiser les requêtes utilisées par l'opérateur. La prochaine
section est consacrée à l'explication de ces informations
additionnelles.
postgresql™ accepte les
opérateurs unaire gauche, unaire droit et binaire. Les opérateurs
peuvent être surchargés ; c'est-à-dire que le même nom d'opérateur
peut être utilisé pour différents opérateurs à condition qu'ils aient
des nombres et des types différents d'opérandes. Quand une requête
est exécutée, le système détermine l'opérateur à appeler en fonction
du nombre et des types d'opérandes fournis.
Voici un exemple de création d'opérateur pour l'addition de deux
nombres complexes. Nous supposons avoir déjà créé la définition du
type complex (voir la Section 33.11, « Types
utilisateur »). premièrement, nous avons besoin d'une
fonction qui fasse le travail, ensuite nous pouvons définir
l'opérateur :
CREATE FUNCTION complex_add(complex, complex)
RETURNS complex
AS 'filename', 'complex_add'
LANGUAGE C;
CREATE OPERATOR + ( leftarg = complex, rightarg = complex, procedure =
complex_add, commutator = + );
Maintenant nous pouvons exécuter la requête comme ceci :
SELECT (a + b) AS c FROM test_complex;
c
-----------------
(5.2,6.05)
(133.42,144.95)
Nous avons montré comment créer un opérateur binaire. Pour créer des
opérateurs unaires, il suffit d'omettre un des leftarg (pour un opérateur unaire gauche) ou
rightarg (pour un opérateur unaire droit).
La clause procedure et les clauses argument
sont les seuls éléments requis dans la commande
create operator
. la clause
commutator montrée dans l'exemple est une
indication optionnelle pour l'optimiseur de requête. Des détails
supplémentaires sur la clause commutator et
d'autres compléments d'optimisation sont donnés dans la prochaine
section.