CREATE OPERATOR CLASS — Définir une nouvelle classe d'opérateur
CREATE OPERATOR CLASSnom
[ DEFAULT ] FOR TYPEtype_donnee
USINGmethode_indexage
[ FAMILYnom_famille
] AS { OPERATORnumero_strategie
nom_operateur
[ (type_op
,type_op
) ] [ FOR SEARCH | FOR ORDER BYnom_famille_tri
] | FUNCTIONnumero_support
[ (type_op
[ ,type_op
] ) ]nom_fonction
(type_argument
[, ...] ) | STORAGEtype_stockage
} [, ... ]
CREATE OPERATOR CLASS
crée une nouvelle classe
d'opérateur. Une classe d'opérateur définit la façon dont un type de
données particulier peut être utilisé avec un index. La classe d'opérateur spécifie
le rôle particulier ou la « stratégie » que jouent certains opérateurs
pour ce type de données et cette méthode d'indexation. La
classe d'opérateur spécifie aussi les fonctions de support à
utiliser par la méthode d'indexation quand la classe d'opérateur est
sélectionnée pour une colonne d'index. Tous les opérateurs et fonctions
utilisés par une classe d'opérateur doivent être définis avant la création de
la classe d'opérateur.
Si un nom de schéma est donné, la classe d'opérateur est créée dans le schéma spécifié. Sinon, elle est créée dans le schéma courant. Deux classes d'opérateur ne peuvent avoir le même nom que s'ils concernent des méthodes d'indexation différentes.
L'utilisateur qui définit une classe d'opérateur en devient propriétaire. Actuellement, le créateur doit être super-utilisateur. Cette restriction existe parce qu'une définition erronée d'une classe d'opérateur peut gêner le serveur, voire causer un arrêt brutal de celui-ci.
Actuellement, CREATE OPERATOR CLASS
ne vérifie pas si la
définition de la classe d'opérateur inclut tous les opérateurs et fonctions
requis par la méthode d'indexation. Il ne vérifie pas non plus si les
opérateurs et les fonctions forment un ensemble cohérent. Il est de la
responsabilité de l'utilisateur de définir une classe d'opérateur valide.
Les classes d'opérateur en relation peuvent être groupées dans des
familles d'opérateurs. Pour ajouter une nouvelle
classe d'opérateur à une famille existante, indiquez l'option
FAMILY
dans CREATE OPERATOR
CLASS
. Sans cette option, la nouvelle classe est placée dans une
famille de même nom (créant la famille si elle n'existe pas).
Section 38.16 fournit de plus amples informations.
nom
Le nom (éventuellement qualifié du nom du schéma) de la classe d'opérateur à créer.
DEFAULT
La classe d'opérateur est celle par défaut pour son type de données. Il ne peut y avoir qu'une classe d'opérateur par défaut pour un type de données et une méthode d'indexation particuliers.
type_données
Le type de données de la colonne auquel s'applique cette classe d'opérateur.
méthode_index
Le nom de la méthode d'indexation à laquelle s'applique la classe d'opérateur.
nom_famille
Le nom d'une famille d'opérateur existante pour lui ajouter cette classe d'opérateur. Si non spécifié, une famille du même nom que l'opérateur est utilisée (la créant si elle n'existe pas déjà).
numéro_stratégie
Le numéro de stratégie de la méthode d'indexation pour un opérateur associé à la classe d'opérateur.
nom_opérateur
Le nom (éventuellement qualifié du nom du schéma) d'un opérateur associé à la classe d'opérateur.
op_type
Dans une clause OPERATOR
, le(s) type(s) de données
de l'opérande d'un opérateur ou NONE
pour
signifier un opérateur préfixe. Les types de données de l'opérande
peuvent être omis dans le cas où ils sont identiques au type de
données de la classe d'opérateur.
Dans une clause FUNCTION
, le (ou les) types de
données en opérande, supporté par la fonction, si différent du type de
données en entrée de la fonction (pour les fonctions de comparaison
d'index B-tree et les fonctions des index hash) ou le type de données de
la classe (pour les fonctions de support du tri pour les index B-tree,
les fonctions d'égalité d'image des B-tree et pour toutes les fonctions
des opérateurs de classe des index GiST, SP-GiST, GIN et BRIN). Ces
valeurs par défaut sont correctes. Du coup, op_type
n'a pas besoin d'être précisé
dans les clauses FUNCTION
, sauf dans le cas de la
fonction de support du tri pour les index B-tree qui doit supporter les
comparaisons inter-types.
nom_famille_tri
Le nom (éventuellement qualifié du nom du schéma) d'une famille d'opérateur
btree
qui décrit l'ordre de tri associé à un
opérateur de tri.
Si ni FOR SEARCH
ni FOR ORDER BY
ne sont spécifiés, FOR SEARCH
est la valeur par
défaut.
numéro_support
Le numéro de fonction support de la méthode d'indexation pour une fonction associée à la classe d'opérateur.
nom_fonction
Le nom (éventuellement qualifié du nom du schéma) d'une fonction support pour la méthode d'indexation de la classe d'opérateur.
types_argument
Le(s) type(s) de données des paramètres de la fonction.
type_stockage
Le type de données réellement stocké dans l'index. C'est normalement le
même que le type de données de la colonne mais certaines méthodes
d'indexage (GiST, GIN, SP-GiST et BRIN actuellement)
autorisent un type différent. La clause STORAGE
doit être omise
sauf si la méthode d'indexation autorise un type différent.
Si la colonne type_donnee
est spécifiée
comme anyarray
, le type_stockage
peut être déclarré comme anyelement
pour indiquer que les
entrées dans l'index sont des membres du type d'élément appartenant au
type de donnée du tableau courant pour lequel chaque index est créé
spécifiquement pour.
L'ordre des clauses OPERATOR
, FUNCTION
et STORAGE
n'a aucune importance.
Comme toute la partie d'indexage ne vérifie pas les droits d'accès aux fonctions avant de les utiliser, inclure une fonction ou un opérateur dans une classe d'opérateur est équivalent à donner les droits d'exécution à PUBLIC sur celle-ci. Ce n'est pas un problème habituellement pour les types de fonctions utiles dans une classe d'opérateur.
Les opérateurs ne doivent pas être définis par des fonctions SQL. Une fonction SQL peut être intégrée dans la requête appelante, ce qui empêche l'optimiseur de faire la correspondance avec un index.
Avant PostgreSQL 8.4, la clause
OPERATOR
pouvait inclure l'option
RECHECK
. Cela n'est plus supporté car le fait qu'un index
soit « à perte » est maintenant déterminé à l'exécution. Ceci
permet une gestion plus efficace des cas où l'opérateur pourrait ou non être
à perte.
La commande issue de l'exemple suivant définit une classe d'opérateur
d'indexation GiST pour le type de données _int4
(tableau de
int4
). Voir le module intarray pour l'exemple
complet.
CREATE OPERATOR CLASS gist__int_ops DEFAULT FOR TYPE _int4 USING gist AS OPERATOR 3 &&, OPERATOR 6 = (anyarray, anyarray), OPERATOR 7 @>, OPERATOR 8 <@, OPERATOR 20 @@ (_int4, query_int), FUNCTION 1 g_int_consistent (internal, _int4, smallint, oid, internal), FUNCTION 2 g_int_union (internal, internal), FUNCTION 3 g_int_compress (internal), FUNCTION 4 g_int_decompress (internal), FUNCTION 5 g_int_penalty (internal, internal, internal), FUNCTION 6 g_int_picksplit (internal, internal), FUNCTION 7 g_int_same (_int4, _int4, internal);
CREATE OPERATOR CLASS
est une extension
PostgreSQL. Il n'existe pas d'instruction
CREATE OPERATOR CLASS
dans le standard SQL.