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.