CREATE OPERATOR CLASS

CREATE OPERATOR CLASS — define uma nova classe de operador

Sinopse

CREATE OPERATOR CLASS nome [ DEFAULT ] FOR TYPE tipo_de_dados
  USING método_de_índice [ FAMILY nome_da_família ] AS
  {  OPERATOR número_da_estratégia nome_do_operador
     [ ( tipo_de_dados_do_operando, tipo_de_dados_do_operando ) ]
     [ FOR SEARCH | FOR ORDER BY nome_da_família_de_ordenação ]
   | FUNCTION número_de_suporte
     [ ( tipo_de_dados_do_operando
     [ , tipo_de_dados_do_operando ] ) ]
     nome_da_função ( tipo_de_dados_do_argumento
     [, ...] )
   | STORAGE tipo_de_dados_armazenado
  } [, ... ]

Descrição

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.

Parâmetros

nome

O nome da classe de operador a ser criada. O nome pode ser qualificado pelo esquema.

DEFAULT

Se 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_dados

O tipo de dados da coluna para o qual esta classe de operador se destina.

método_de_índice

O nome do método de índice para o qual esta classe de operador se destina.

nome_da_família

O 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égia

O número da estratégia do método de índice para o operador associado à classe de operador.

nome_do_operador

O 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_suporte

O número da função de suporte do método de índice para a função associada à classe de operador.

nome_da_função

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

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

Notas

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.

Exemplos

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

Conformidade

O comando CREATE OPERATOR CLASS é uma extensão do PostgreSQL. Não existe o comando CREATE OPERATOR CLASS no padrão SQL.

Veja também

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