CREATE OPERATOR CLASS

CREATE OPERATOR CLASS — definir una nueva clase de operadores

Synopsis

CREATE OPERATOR CLASS nombre [ DEFAULT ] FOR TYPE tipo_datos
  USING método_índice [ FAMILY nombre_familia ] AS
  {  OPERATOR número_estrategia nombre_operador [ ( tipo_op, tipo_op ) ] [ FOR SEARCH | FOR ORDER BY nombre_familia_ordenamiento ]
   | FUNCTION número_soporte [ ( tipo_op [ , tipo_op ] ) ] nombre_función ( tipo_argumento [, ...] )
   | STORAGE tipo_almacenamiento
  } [, ... ]

Descripción

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.

Parámetros

nombre

El nombre de la clase de operadores que se va a crear. El nombre puede estar calificado por esquema.

DEFAULT

Si 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_datos

El tipo de datos de columna para el cual es esta clase de operadores.

método_índice

El nombre del método de índice para el cual es esta clase de operadores.

nombre_familia

El 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_estrategia

El número de estrategia del método de índice para un operador asociado con la clase de operadores.

nombre_operador

El 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_soporte

El número de función de soporte del método de índice para una función asociada con la clase de operadores.

nombre_función

El 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_argumento

El 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.

Notas

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.

Ejemplos

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);

Compatibilidad

CREATE OPERATOR CLASS es una extensión de PostgreSQL. No existe la sentencia CREATE OPERATOR CLASS en el estándar SQL.

Consulte también

ALTER OPERATOR CLASS, DROP OPERATOR CLASS, CREATE OPERATOR FAMILY, ALTER OPERATOR FAMILY