Dado:
$psql -U postgres
Password for user postgres:
psql (12.1, server 9.6.2)
postgres=# \d foo
Table "public.foo"
Column | Type | Collation | Nullable | Default
--------+---------+-----------+----------+---------
a | integer | | |
Corri então:
postgres=# select count(*) from foo;
count
-------
0
(1 row)
postgres=# insert into foo (a) values (1) returning (select count(*) from foo);
count
-------
0
(1 row)
INSERT 0 1
Por que ele retornou 0
em vez de 1
, ou seja, desde que inseri uma linha?
O
select count(*) from foo
interior da cláusula de retorno é avaliado antes da inserção e, em seguida, tratado como uma constante na cláusula de retorno, comoexplain
mostra claramente:Isso é confirmado pela documentação onde diz que a cláusula de retorno pode conter nomes de colunas ou expressões de valor (usando essas colunas) a serem retornadas (salvando uma consulta após a inserção):