CREATE OPERATOR CLASS — define uma nova classe de operador
CREATE OPERATOR CLASSnome[ DEFAULT ] FOR TYPEtipo_de_dadosUSINGmétodo_de_índice[ FAMILYnome_da_família] AS { OPERATORnúmero_da_estratégianome_do_operador[ (tipo_de_dados_do_operando,tipo_de_dados_do_operando) ] [ FOR SEARCH | FOR ORDER BYnome_da_família_de_ordenação] | FUNCTIONnúmero_de_suporte[ (tipo_de_dados_do_operando[ ,tipo_de_dados_do_operando] ) ]nome_da_função(tipo_de_dados_do_argumento[, ...] ) | STORAGEtipo_de_dados_armazenado} [, ... ]
O comando CREATE OPERATOR CLASS define uma nova
classe de operador.
Uma classe de operador define como um determinado tipo de dados pode
ser usado com um índice.
A classe de operador especifica que certos operadores preencherão
papéis ou “estratégias” específicos para este
tipo de dados e este método de índice.
A classe de operador também especifica as funções de suporte a serem
usadas pelo método de índice quando a classe de operador é
selecionada para uma coluna de índice.
Todos os operadores e funções usados por uma classe de operador
devem ser definidos antes que a classe de operador possa ser criada.
Se for especificado um nome de esquema, a classe de operador será criada no esquema especificado. Caso contrário, será criada no esquema corrente. Duas classes de operador no mesmo esquema podem ter o mesmo nome somente se forem para métodos de índice diferentes.
O usuário que define uma classe de operador torna-se seu dono. No momento, o usuário criador deve ser um superusuário. (Esta restrição é feita, porque uma definição de classe de operador incorreta pode confundir ou até travar o servidor.)
O comando CREATE OPERATOR CLASS no momento não
verifica se a definição da classe de operador inclui todos os
operadores e funções exigidos pelo método de índice, nem se os
operadores e funções formam um conjunto autoconsistente.
É responsabilidade do usuário definir uma classe de operador válida.
As classes de operador relacionados podem ser agrupadas em
famílias de operador.
Para adicionar uma nova classe de operador a uma família existente,
deve ser especificada a opção FAMILY no comando
CREATE OPERATOR CLASS.
Sem esta opção, a nova classe será colocada em uma família com o
mesmo nome da nova classe
(criando esta família, se ainda não existir).
Veja Interligando extensões a índices para obter mais informações.
nomeO nome da classe de operador a ser criada. O nome pode ser qualificado pelo esquema.
DEFAULTSe estiver presente, a classe de operador se tornará a classe de operador padrão para seu tipo de dados. No máximo uma classe de operador pode ser a classe padrão para um tipo de dados e método de índice específicos.
tipo_de_dadosO tipo de dados da coluna para o qual esta classe de operador se destina.
método_de_índiceO nome do método de índice para o qual esta classe de operador se destina.
nome_da_famíliaO nome da família de operador existente à qual esta classe de operador deve ser adicionada. Se não for especificado, será usada uma família com o mesmo nome da classe de operador (criando-a, se ainda não existir).
número_da_estratégiaO número da estratégia do método de índice para o operador associado à classe de operador.
nome_do_operadorO nome (opcionalmente qualificado pelo esquema) do operador associado à classe de operador.
tipo_de_dados_do_operando
Na cláusula OPERATOR, o(s) tipo(s) de dados
do operando do operador, ou NONE para
significar um operador de prefixo.
Os tipos de dados do operando podem ser omitidos no caso normal
em que são iguais ao tipo de dados da classe de operador.
Na cláusula FUNCTION, o(s) tipo(s) de dados
do operando que a função deve fornecer suporte, se diferente(s)
do(s) tipo(s) de dados de entrada da função
(para funções de comparação de Árvore-B e funções de
hash), ou o tipo de dados da classe
(para funções de suporte de classificação de Árvore-B,
funções de imagem igual de Árvore-B, e todas as funções nas
classes de operador GiST,
SP-GiST, GIN e
BRIN).
Estes padrões estão corretos e, portanto,
op_type não precisa
ser especificado nas cláusulas FUNCTION,
exceto no caso de uma função de suporte de classificação de
Árvore-B que se destina a oferecer suporte a comparações de
tipo de dados cruzados.
nome_da_família_de_ordenação
O nome (opcionalmente qualificado pelo esquema) da
família de operador btree existente que
descreve a ordem de classificação associada a um operador de
ordenação.
Se nem FOR SEARCH, nem
FOR ORDER BY, forem especificados,
FOR SEARCH será o padrão.
número_de_suporteO número da função de suporte do método de índice para a função associada à classe de operador.
nome_da_funçãoO nome (opcionalmente qualificado pelo esquema) da função que é a função de suporte de método de índice para a classe de operador.
tipo_de_dados_do_argumentoOs tipos de dados de parâmetro da função.
tipo_de_dados_armazenado
O tipo de dados realmente armazenado no índice.
Normalmente é igual ao tipo de dados da coluna, mas alguns
métodos de índice (no momento GiST,
GIN, SP-GiST e
BRIN) permitem que seja diferente.
A cláusula STORAGE deve ser omitida, a menos
que o método de índice permita que seja usado um tipo diferente.
Se a coluna tipo_de_dados
for especificada como anyarray, o
tipo_de_dados_armazenado
poderá ser declarado como anyelement para indicar que
as entradas do índice são membros do tipo de elemento pertencente
ao tipo matriz real para o qual cada índice específico foi criado.
As cláusulas OPERATOR, FUNCTION,
e STORAGE pode aparecer em qualquer ordem.
Como o mecanismo de indexação não verifica as permissões de acesso nas funções antes de usá-las, incluir uma função ou operador em uma classe de operador equivale a conceder permissão pública de execução a mesma. Isto geralmente não é um problema para os tipos de funções que são úteis em uma classe de operador.
Os operadores não devem ser definidos por funções SQL. É provável que uma função SQL seja incorporada na consulta de chamada, o que impedirá que o otimizador reconheça que a consulta corresponde a um índice.
O exemplo de comando a seguir define uma classe de operador de índice
GiST para o tipo de dados _int4
(matriz de int4).
Veja no módulo intarray o exemplo 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);
O comando CREATE OPERATOR CLASS é uma extensão do
PostgreSQL.
Não existe o comando CREATE OPERATOR CLASS no
padrão SQL.