ALTER OPERATOR FAMILY — modifica a definição de uma família de operador
ALTER OPERATOR FAMILYnomeUSINGmétodo_de_índiceADD { 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[, ...] ) ] } [, ... ] ALTER OPERATOR FAMILYnomeUSINGmétodo_de_índiceDROP { OPERATORnúmero_da_estratégia(tipo_de_dados_do_operando [ ,tipo_de_dados_do_operando] ) | FUNCTIONnúmero_de_suporte(tipo_de_dados_do_operando [ ,tipo_de_dados_do_operando] ) } [, ... ] ALTER OPERATOR FAMILYnome USINGmétodo_de_índiceRENAME TOnovo_nomeALTER OPERATOR FAMILYnome USINGmétodo_de_índiceOWNER TO {novo_dono| CURRENT_ROLE | CURRENT_USER | SESSION_USER } ALTER OPERATOR FAMILYnome USINGmétodo_de_índiceSET SCHEMAnovo_esquema
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.
nomeO nome (opcionalmente qualificado pelo esquema) da família de operador existente.
método_de_índiceO nome do método de índice para o qual esta família de operador se destina.
número_da_estratégiaO número da estratégia do método de índice para o operador associado à família de operador.
nome_do_operadorO 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_suporteO número da função de suporte do método de índice para a função associada à família 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 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_argumentoOs tipos de dados de parâmetro da função.
novo_nomeO novo nome da família de operador.
novo_donoO novo dono da família de operador.
novo_esquemaO novo esquema para a família de operador.
As cláusulas OPERATOR e FUNCTION
podem aparecer em qualquer ordem.
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.
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) ;
Não existe o comando ALTER OPERATOR FAMILY
no padrão SQL.