CREATE OPERATOR CLASS
CREATE OPERATOR CLASS — Définir une nouvelle classe
d'opérateur
Synopsis
CREATE OPERATOR CLASS nom [ DEFAULT ] FOR TYPE type_données USING méthode_index AS
{ OPERATOR numéro_stratégie nom_opérateur [ ( op_type, op_type ) ] [ RECHECK ]
| FUNCTION numéro_support nom_fonction ( type_argument [, ...] )
| STORAGE type_stockage
} [, ... ]
Description
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 procédures 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 superutilisateur.
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 verifie 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.
Section 33.14,
« Interfacer des extensions d'index » fournit de plus
amples informations.
Paramètres
-
nom
-
Le nom (éventuellement qualifié du nom du schém) 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.
-
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
-
Le(s) type(s) de données de l'opérande d'un opérateur ou
NONE pour signifier un opérateur
unaire (droite ou gauche). 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.
-
RECHECK
-
L'indexation de cet opérateur est « faible ». Dans ce cas, il faut
recontrôler la validité de chaque ligne chargée par rapport à
l'opérateur.
-
numéro_support
-
Le numéro de procédure 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 procédure 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 (GIN et GiST actuellement)
autorisent un type différent. La clause STORAGE doit être omise sauf si la méthode
d'indexation autorise un type différent.
L'ordre des clauses OPERATOR, FUNCTION et STORAGE n'a
aucune importance.
Notes
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 the index machinery does not
check access permissions on functions before using them, including
a function or operator in an operator class is é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.
Exemples
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 contrib/intarray/ pour l'exemple
complet.
CREATE OPERATOR CLASS gist__int_ops
DEFAULT FOR TYPE _int4 USING gist AS
OPERATOR 3 &&,
OPERATOR 6 = RECHECK,
OPERATOR 7 @>,
OPERATOR 8 <@,
OPERATOR 20 @@ (_int4, query_int),
FUNCTION 1 g_int_consistent (internal, _int4, int4),
FUNCTION 2 g_int_union (bytea, 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);
Compatibilité
CREATE OPERATOR CLASS
est une extension PostgreSQL™. Il n'existe pas
d'instruction
CREATE OPERATOR
CLASS
dans le standard SQL.