Cenário 1
Basicamente, digamos que temos uma função que está usando SQL dinâmico, mas também sabemos que ela sempre retornará a mesma saÃda para a mesma entrada e a declarará imutável será realmente imutável? aka, o compilador/processador de consulta estará ciente desse cenário especÃfico?
De acordo com a documentação oficial
Uma função IMMUTABLE não pode modificar o banco de dados e tem a garantia de retornar os mesmos resultados com os mesmos argumentos para sempre. Esta categoria permite ao otimizador pré-avaliar a função quando uma consulta a chama com argumentos constantes.
Por essa lógica, deve funcionar muito bem, pois se preocupa apenas com a entrada ser a mesma.
Cenário #2
O mesmo que acima, mas o tipo de entrada é anyelement
ou anyarray
. Considerando que SQL é uma linguagem fortemente tipada (de documentos oficiais)
SQL é uma linguagem fortemente tipada. Ou seja, cada item de dados tem um tipo de dados associado que determina seu comportamento e uso permitido.
E saber que anyelement
é simplesmente um pseudotipo porque na verdade durante o processamento de funções ele sabe que é (por exemplo) um inteiro ou string. Então, desse ponto de vista, não importa se uma função também aceita anyelement
quando é imutável.
Gostaria de saber se o que está escrito acima é de fato o verdadeiro comportamento do PostgreSQL nessas condições. E se houver alguma diferença em comparação com funções imutáveis ​​regulares com SQL regular.
Se uma função for declarada
IMMUTABLE
, mas o corpo contiver funções de menor volatilidade (STABLE
,VOLATILE
), então a função embutida das funções SQL será desabilitada. Então, sim, o Postgres se importa com "o que está dentro".Existem diferenças entre funções SQL e funções com outras linguagens procedurais como PL/pgSQL. SQL dinâmico não é possÃvel em funções SQL para começar. Relacionado:
Mas para muitos propósitos, o Postgres está satisfeito com a volatilidade da função declarada . Por exemplo, se você criar um Ãndice envolvendo uma função personalizada, ele deverá ser declarado
IMMUTABLE
. É sua responsabilidade manter essa promessa, ou o Ãndice quebrará silenciosamente.Exemplo:
Polimorfismo (usando
anyelement
et al.) é um conceito ortogonal. Funções polimórficas podem ter qualquer declaração de volatilidade.