CREATE OPERATOR CLASS — definir una nueva clase de operadores
CREATE OPERATOR CLASSnombre[ DEFAULT ] FOR TYPEtipo_datosUSINGmétodo_índice[ FAMILYnombre_familia] AS { OPERATORnúmero_estrategianombre_operador[ (tipo_op,tipo_op) ] [ FOR SEARCH | FOR ORDER BYnombre_familia_ordenamiento] | FUNCTIONnúmero_soporte[ (tipo_op[ ,tipo_op] ) ]nombre_función(tipo_argumento[, ...] ) | STORAGEtipo_almacenamiento} [, ... ]
CREATE OPERATOR CLASS crea una nueva clase de operadores.
Una clase de operadores define cómo se puede usar un tipo de datos particular con
un índice. La clase de operadores especifica que ciertos operadores cumplirán roles
particulares o «estrategias» (strategies) para este tipo de datos y este método de
índice. La clase de operadores también especifica las funciones de soporte que debe
utilizar el método de índice cuando se selecciona la clase de operadores para una
columna de índice. Todos los operadores y funciones utilizados por una clase de
operadores deben definirse antes de que se pueda crear la clase de operadores.
Si se proporciona un nombre de esquema, la clase de operadores se crea en el esquema especificado. De lo contrario, se crea en el esquema actual. Dos clases de operadores en el mismo esquema pueden tener el mismo nombre solo si son para métodos de índice diferentes.
El usuario que define una clase de operadores se convierte en su propietario. Actualmente, el usuario creador debe ser un superusuario. (Esta restricción se realiza porque una definición errónea de una clase de operadores podría confundir o incluso hacer caer el servidor).
Actualmente, CREATE OPERATOR CLASS no verifica si la definición de la
clase de operadores incluye todos los operadores y funciones requeridos por el método de índice,
ni si los operadores y funciones forman un conjunto autoconsistente. Es responsabilidad del
usuario definir una clase de operadores válida.
Las clases de operadores relacionadas se pueden agrupar en familias de operadores
(operator families). Para añadir una nueva clase de operadores a una familia existente, especifica
la opción FAMILY en CREATE OPERATOR CLASS. Sin esta opción,
la nueva clase se coloca en una familia con el mismo nombre que la nueva clase (creando esa familia
si no existe ya).
Consulta la Section 36.16 para obtener más información.
nombreEl nombre de la clase de operadores que se va a crear. El nombre puede estar calificado por esquema.
DEFAULTSi está presente, la clase de operadores se convertirá en la clase de operadores predeterminada para su tipo de datos. Como máximo, una clase de operadores puede ser la predeterminada para un tipo de datos y método de índice específicos.
tipo_datosEl tipo de datos de columna para el cual es esta clase de operadores.
método_índiceEl nombre del método de índice para el cual es esta clase de operadores.
nombre_familiaEl nombre de la familia de operadores existente a la que se va a añadir esta clase de operadores. Si no se especifica, se utiliza una familia con el mismo nombre que la clase de operadores (creándola si no existe ya).
número_estrategiaEl número de estrategia del método de índice para un operador asociado con la clase de operadores.
nombre_operadorEl nombre (opcionalmente calificado por esquema) de un operador asociado con la clase de operadores.
tipo_op
En una cláusula OPERATOR, el o los tipos de datos de los operandos del operador,
o NONE para indicar un operador de prefijo. Los tipos de datos de los operandos
se pueden omitir en el caso normal en el que son los mismos que el tipo de datos de la clase de operadores.
En una cláusula FUNCTION, el o los tipos de datos de los operandos que la función
está destinada a soportar, si son diferentes del o los tipos de datos de entrada de la función (para
funciones de comparación y funciones hash de B-tree) o del tipo de datos de la clase (para funciones
de soporte de ordenamiento de B-tree, funciones de imagen igual de B-tree y todas las funciones en
clases de operadores GiST, SP-GiST, GIN y BRIN). Estos valores predeterminados son correctos, por lo que
no es necesario especificar tipo_op en las cláusulas
FUNCTION, excepto en el caso de una función de soporte de ordenamiento de B-tree que
está destinada a admitir comparaciones entre diferentes tipos de datos.
nombre_familia_ordenamiento
El nombre (opcionalmente calificado por esquema) de una familia de operadores btree
existente que describe el orden de clasificación asociado con un operador de ordenamiento.
Si no se especifica ni FOR SEARCH ni FOR ORDER BY,
se asume FOR SEARCH por defecto.
número_soporteEl número de función de soporte del método de índice para una función asociada con la clase de operadores.
nombre_funciónEl nombre (opcionalmente calificado por esquema) de una función que es una función de soporte del método de índice para la clase de operadores.
tipo_argumentoEl o los tipos de datos de los parámetros de la función.
tipo_almacenamiento
El tipo de datos realmente almacenado en el índice. Normalmente, este es el mismo que el tipo de datos de la
columna, pero algunos métodos de índice (actualmente GiST, GIN, SP-GiST y BRIN) permiten que sea diferente. La
cláusula STORAGE debe omitirse a menos que el método de índice permita usar un tipo diferente.
Si el tipo_datos de la columna se especifica como anyarray,
el tipo_almacenamiento se puede declarar como anyelement
para indicar que las entradas del índice son miembros del tipo de elemento perteneciente al tipo de array real
para el cual se crea cada índice en particular.
Las cláusulas OPERATOR, FUNCTION y STORAGE pueden
aparecer en cualquier orden.
Dado que el mecanismo de indexación no verifica los permisos de acceso en las funciones antes de usarlas, incluir una función o un operador en una clase de operadores equivale a otorgar el permiso de ejecución público sobre ella. Esto no suele ser un problema para los tipos de funciones que son útiles en una clase de operadores.
Los operadores no deben definirse mediante funciones SQL. Es probable que una función SQL se inserte en línea (inlined) en la consulta que la llama, lo que evitará que el optimizador reconozca que la consulta coincide con un índice.
El siguiente ejemplo define una clase de operadores de índice GiST para el tipo de datos _int4
(array de int4). Consulta el módulo intarray para el ejemplo completo.
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 es una extensión de PostgreSQL.
No existe la sentencia CREATE OPERATOR CLASS en el estándar SQL.