Estou em uma situação peculiar:
Eu tenho vários índices com expressões que usam uma função. Quero trocá-los para uma função diferente, onde posso garantir que a função se comporte da mesma forma (para que os valores indexados não sejam inválidos). Idealmente, não quero descartar o índice existente e reindexá-lo, porque isso requer mais sobrecarga de desenvolvimento.
Eu posso ver na pg_index
tabela, há uma indexprs
coluna, que contém a definição "interna" de um índice (a pg_indexes
tabela é uma versão muito impressa disso). Especificamente, acho que identifiquei os índices relevantes para ter um formato nos moldes de ({FUNCEXPR :funcid 870 :funcresulttype 25 :funcretset false
...
Voltando funcid 870
para o information_schema.routines
, consegui correlacioná-lo no specific_name
(que contém esse funcid) e pude determinar que é de fato a função específica que quero alterar.
Seria - teoricamente - possível substituir esse funcid pelo novo funcid e os índices então se refeririam à nova função? Como eu faria isso, já que esta coluna é do tipo pg_node_tree? Se não, existe uma maneira de atingir meu objetivo de uma maneira não hackeada?
Adendo: Provavelmente ainda farei isso da maneira "limpa", a menos que haja uma maneira segura e comprovada de fazer isso, mas isso despertou meu interesse o suficiente para fazer uma pergunta sobre isso.
Se você fizer certo, isso funcionaria, mas eu também não faria dessa maneira.
Mas isso não é suficiente: o PostgreSQL também mantém o controle da dependência entre o índice e a função por entradas em
pg_depend
, então você teria que modificar a respectiva entrada também. Caso contrário, você receberia mensagens de erro interessantes ao tentar descartar o índice. Se ooid
870 for reutilizado para uma função diferente posteriormente, você também poderá obter outras formas interessantes de corrupção de dados.