Parece que o postgres trata a string 'now()'
da mesma forma que uma chamada para a now()
função.
Por que o postgres permite isso?
select 'now'::timestamp;
ou isto?
select 'now()'::timestamp;
ou mesmo isso?
select ' ( ( ))) now)('::timestamp;
Ele não fornece esse tratamento "uma string é igual a uma função" para outras funções, como clock_timestamp()
.
'now'
(com qualquer quantidade de espaços e colchetes à esquerda e à direita ({[( )]}
, que é cortado como ruído) é uma constante de entrada de data/hora especial . Ela avalia o carimbo de data/hora da transação atual.Se você achar isso estranho, tente
SELECT 'allballs'::time;
algum tempo. :)now()
(sem aspas simples e exatamente um par de parênteses finais), por outro lado, é uma função avaliada em tempo de execução.Acontece que ambos usam a mesma palavra em inglês, porque retornam a "hora atual". Mas ambos são de natureza muito diferente.
A diferença fica evidente quando você usa qualquer uma delas como padrão de coluna. O primeiro cimenta o carimbo de data/hora da transação definindo o padrão da coluna. O segundo avalia o carimbo de data/hora da transação que insere uma nova linha dinamicamente. (Normalmente, você quer o segundo.)
Ver: