CREATE OPERATOR nom ( PROCEDURE = nomfonc [, LEFTARG = typegauche ] [, RIGHTARG = typedroit ] [, COMMUTATOR = op_com ] [, NEGATOR = op_neg ] [, RESTRICT = proc_res ] [, JOIN = proc_join ] [, HASHES ] [, MERGES ] [, SORT1 = op_tri_gauche ] [, SORT2 = op_tri_droit ] [, LTCMP = op_inf ] [, GTCMP = op_sup ] )
CREATE OPERATOR définit un nouvel opérateur, nom . L'utilisateur qui définit un opérateur en devient propriétaire. Si un nom de schéma est donné, l'opérateur est créé dans le schéma spécifié. Sinon, il est créé dans le schéma courant.
Le nom de l'opérateur est une séquence d'au plus NAMEDATALEN-1 (63 par défaut) caractères parmi la liste suivante :
+ - * / < > = ~ ! @ # % ^ & | ` ?
Il existe quelques restrictions dans le choix du nom :
-- et /* ne peuvent pas apparaître dans le nom d'un opérateur car ils sont pris pour le début d'un commentaire.
Un nom d'opérateur multicaractères ne peut pas finir avec + ou - sauf si le nom contient l'un, au moins, de ces caractères :
~ ! @ # % ^ & | ` ?
Par exemple, @- est un nom d'opérateur autorisé mais *- n'en est pas un. Cette restriction permet à PostgreSQL™ d'analyser les commandes compatibles SQL sans nécessiter d'espaces entre les lexèmes.
L'opérateur != est remplacé par <> à la saisie, ces deux noms sont donc toujours équivalents.
Au moins un des deux LEFTARG et RIGHTARG doit être défini. Pour les opérateurs binaires, les deux doivent l'être. Pour les opérateurs unaires droits, seul LEFTARG doit l'être, RIGHTARG pour les opérateurs unaires gauches.
La procédure nomfonc doit avoir été précédemment définie par CREATE FUNCTION et doit accepter le bon nombre d'arguments (un ou deux) des types indiqués.
Les autres clauses spécifient des clauses optionnelles d'optimisation d'opérateur. Leur signification est détaillée dans Section 33.13, « Informations sur l'optimisation d'un opérateur ».
Le nom de l'opérateur à définir. Voir ci-dessus pour les caractères autorisés. Le nom peut être qualifié du nom du schéma, par exemple CREATE OPERATOR monschema.+ (...). Dans le cas contraire, il est créé dans le schéma courant. Deux opérateurs dans le même schéma peuvent avoir le même nom s'ils opérent sur des types de données différents. On parle alors de surchargement.
La fonction utilisée pour implanter cet opérateur.
Le type de données de l'opérande gauche de l'opérateur, s'il existe. Cette option est omise pour un opérateur unaire gauche.
Le type de données de l'opérande droit de l'opérateur, s'il existe. Cette option est omise pour un opérateur unaire droit.
Le commutateur de cet opérateur.
La négation de cet opérateur.
La fonction d'estimation de la sélectivité de restriction pour cet opérateur.
La fonction d'estimation de la sélectivité de jointure pour cet opérateur.
L'opérateur peut supporter une jointure de hachage.
L'opérateur peut supporter une jointure d'assemblage.
Si l'opérateur supporte une jointure d'assemblage, cette clause spécifie l'opérateur inférieur de tri du type de données gauche de l'opérateur.
Si l'opérateur supporte une jointure d'assemblage, cette clause spécifie l'opérateur inférieur de tri du type de données droite de l'opérateur.
Si l'opérateur supporte une jointure d'assemblage, cette clause spécifie l'opérateur inférieur de comparaison des types de données en entrée de l'opérateur.
Si l'opérateur supporte une jointure d'assemblage, cette clause spécifie l'opérateur supérieur de comparaison des types de données en entrée de l'opérateur.
La syntaxe OPERATOR() est utilisée pour préciser un nom d'opérateur qualifié d'un schéma dans op_com ou dans les autres arguments optionnels. Par exemple
COMMUTATOR = OPERATOR(mon_schema.===) ,
Section 33.12, « Opérateurs définis par l'utilisateur » fournit de plus amples informations.
DROP OPERATOR est utilisé pour supprimer les opérateurs utilisateur, ALTER OPERATOR pour les modifier.
La commande suivante définit un nouvel opérateur, « area-equality », pour le type de données box :
CREATE OPERATOR === ( LEFTARG = box, RIGHTARG = box, PROCEDURE = area_equal_procedure, COMMUTATOR = ===, NEGATOR = !==, RESTRICT = area_restriction_procedure, JOIN = area_join_procedure, HASHES, SORT1 = <<<, SORT2 = <<< -- Puisque les opérateurs de tri sont précisés, MERGES est assumé. -- LTCMP et GTCMP sont respectivement < et >. );