A palavra-chave
IMMUTABLE é nunca adicionados automaticamente pelo pgAdmin ou Postgres. Quem criou ou substituiu a função fez isso. A volatilidade correta para a função fornecida é
VOLATILE (também o padrão), não STABLE - ou não faria sentido usar clock_timestamp() que é VOLATILE em contraste com now() ou CURRENT_TIMESTAMP que são STABLE :aqueles retornam o mesmo timestamp dentro da mesma transação. O manual:
clock_timestamp()retorna a hora atual real e, portanto, seu valor muda mesmo dentro de um único comando SQL.
O manual avisa que a volatilidade da função
STABLE ...
é impróprio paraAFTERgatilhos que desejam consultar linhas modificadas pelo comando atual.
.. porque a avaliação repetida da função de gatilho pode retornar diferente resultados para a mesma linha. Então, não
STABLE . Você pergunta:
Você tem uma idéia de por que a função retornou corretamente cinco vezes antes de ficar no quinto valor quando definido comoIMMUTABLE?
A Wiki do Postgres:
Com 9.2, o planejador utilizará planos específicos em relação aos parâmetros enviados (a consulta será planejada na execução), exceto se a consulta for executada várias vezes e o planejador decide que o plano genérico não é muito mais caro do que os planos específicos.
Minha ênfase em negrito. Não parece fazer sentido para um
IMMUTABLE função sem parâmetros de entrada. Mas o rótulo falso é substituído pelo VOLATILE função no corpo (voids função embutida ):um plano de consulta diferente ainda pode fazer sentido. - Desempenho do procedimento armazenado do PostgreSQL
À parte
trunc() é um pouco mais rápido que floor() e faz o mesmo aqui, já que números positivos são garantidos:SELECT (trunc(EXTRACT(EPOCH FROM clock_timestamp()) * 10) - 13885344000)::int