Documentation PostgreSQL 14.22 » Programmation serveur » Étendre SQL » Opérateurs définis par l'utilisateur

Précédent | Niveau supérieur | Suivant
38.13. Types utilisateur | Sommaire | 38.15. Informations sur l'optimisation d'un opérateur

## 38.14. 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 préfixes et infixes. 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 38.13). 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,
         function = 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 préfixes, il suffit d'omettre `leftarg`. La clause `function` 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.