ALTER OPERATOR FAMILY

ALTER OPERATOR FAMILY — modifica a definição de uma família de operador

Sinopse

ALTER OPERATOR FAMILY nome USING método_de_índice ADD
  {  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 [, ...] ) ]
  } [, ... ]

ALTER OPERATOR FAMILY nome USING método_de_índice DROP
  {  OPERATOR número_da_estratégia ( tipo_de_dados_do_operando​
    [ , tipo_de_dados_do_operando ] ) |​
    FUNCTION número_de_suporte ( tipo_de_dados_do_operando​
    [ , tipo_de_dados_do_operando ] )
  } [, ... ]

ALTER OPERATOR FAMILY nome​
    USING método_de_índice
    RENAME TO novo_nome

ALTER OPERATOR FAMILY nome​
    USING método_de_índice
    OWNER TO {
        novo_dono
      | CURRENT_ROLE
      | CURRENT_USER
      | SESSION_USER
    }

ALTER OPERATOR FAMILY nome​
    USING método_de_índice
    SET SCHEMA novo_esquema

Descrição

O comando ALTER OPERATOR FAMILY altera a definição de uma família de operador. Pode-se adicionar operadores e funções de suporte à família, removê-los da família, ou alterar o nome, ou o dono, da família.

Quando são adicionados operadores e funções de suporte a uma família com o comando ALTER OPERATOR FAMILY, eles não fazem parte de nenhuma classe de operador específica dentro da família, ficando apenas soltos dentro da família. Isto indica que estes operadores e funções são compatíveis com a semântica da família, mas não são necessários para o correto funcionamento de nenhum índice específico. (Os operadores e funções necessários devem ser declarados como parte de uma classe de operador; veja CREATE OPERATOR CLASS.) O PostgreSQL permite que membros soltos de uma família sejam removidos da família a qualquer momento, mas os membros de uma classe de operador não podem ser removidos sem remover toda a classe e quaisquer índices que dependam dela. Normalmente, os operadores e funções de tipo de dados único fazem parte de classes de operador, porque são necessários para dar suporte a um índice neste tipo de dados específico, enquanto operadores e funções de tipo de dados cruzados são membros soltos da família.

É necessário ser um superusuário para usar o comando ALTER OPERATOR FAMILY. (Esta restrição é feita porque uma definição incorreta de família de operador pode confundir ou até travar o servidor.)

O comando ALTER OPERATOR FAMILY no momento não verifica se a definição da família 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 família de operador válida.

Veja Interligando extensões a índices para obter mais informações.

Parâmetros

nome

O nome (opcionalmente qualificado pelo esquema) da família de operador existente.

método_de_índice

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

número_da_estratégia

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

nome_do_operador

O nome (opcionalmente qualificado pelo esquema) do operador associado à família 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. Ao contrário da sintaxe semelhante no comando CREATE OPERATOR CLASS, os tipos de dados do operando devem ser sempre especificados.

Em uma cláusula ADD FUNCTION, o(s) tipo(s) de dados do operando que a função deve suportar, 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, não é necessário especificar op_type, uma vez que os tipos de dados de entrada da função são sempre os corretos a serem usados. 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 e GIN, é necessário especificar o(s) tipo(s) de dados do operando com os quais a função será usada.

Na cláusula DROP FUNCTION, devem ser especificados o(s) tipo(s) de dados do operando que a função pretende dar suporte.

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 não for especificado nem FOR SEARCH, nem FOR ORDER BY, o padrão será FOR SEARCH.

número_de_suporte

O número da função de suporte do método de índice para a função associada à família 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 família de operador. Se não for especificada nenhuma lista de argumentos, o nome deverá ser único em seu esquema.

tipo_de_dados_do_argumento

Os tipos de dados de parâmetro da função.

novo_nome

O novo nome da família de operador.

novo_dono

O novo dono da família de operador.

novo_esquema

O novo esquema para a família de operador.

As cláusulas OPERATOR e FUNCTION podem aparecer em qualquer ordem.

Notas

Note que a sintaxe para DROP especifica apenas o encaixe na família de operador, por estratégia ou número de suporte, e tipo(s) de dados de entrada. O nome do operador ou função que ocupa o encaixe não é mencionado. Além disso, para DROP FUNCTION, o(s) tipo(s) a serem especificados são os tipos de dados de entrada que a função deve dar suporte; para os índices GiST, SP-GiST e GIN, isto pode não ter nada a ver com os tipos de dados dos argumentos de entrada reais da função.

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 família de operador equivale a conceder permissão de execução pública a mesma. Isto geralmente não é um problema para os tipos de funções que são úteis em uma família de operador.

Os operadores não devem ser definidos por funções SQL. É provável que a 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 adiciona operadores de tipo de dados cruzados, e oferece suporte a funções para uma família de operador que já contém classes de operador de árvore-B para os tipos de dados int4 e int2.

ALTER OPERATOR FAMILY integer_ops USING btree ADD

  -- int4 vs int2
  OPERATOR 1 < (int4, int2) ,
  OPERATOR 2 <= (int4, int2) ,
  OPERATOR 3 = (int4, int2) ,
  OPERATOR 4 >= (int4, int2) ,
  OPERATOR 5 > (int4, int2) ,
  FUNCTION 1 btint42cmp(int4, int2) ,

  -- int2 vs int4
  OPERATOR 1 < (int2, int4) ,
  OPERATOR 2 <= (int2, int4) ,
  OPERATOR 3 = (int2, int4) ,
  OPERATOR 4 >= (int2, int4) ,
  OPERATOR 5 > (int2, int4) ,
  FUNCTION 1 btint24cmp(int2, int4) ;

Para remover estas entradas novamente:

ALTER OPERATOR FAMILY integer_ops USING btree DROP

  -- int4 vs int2
  OPERATOR 1 (int4, int2) ,
  OPERATOR 2 (int4, int2) ,
  OPERATOR 3 (int4, int2) ,
  OPERATOR 4 (int4, int2) ,
  OPERATOR 5 (int4, int2) ,
  FUNCTION 1 (int4, int2) ,

  -- int2 vs int4
  OPERATOR 1 (int2, int4) ,
  OPERATOR 2 (int2, int4) ,
  OPERATOR 3 (int2, int4) ,
  OPERATOR 4 (int2, int4) ,
  OPERATOR 5 (int2, int4) ,
  FUNCTION 1 (int2, int4) ;

Conformidade

Não existe o comando ALTER OPERATOR FAMILY no padrão SQL.

Veja também

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