On Wed, Jan 10, 2024 at 12:29:54PM +0100, Torsten Förtsch wrote:
> Hi,
>
> imagine a simple table with 1 row
>
> =# table tf;
> i | x
> ---+----
> 1 | xx
> (1 row)
>
> And this query:
>
> with x as (update tf set i=i+1 returning *)
> , y as (update tf set x=x||'yy' returning *)
> select * from x,y;
>
> My PG14 gives this result
>
> i | x | i | x
> ---+---+---+---
> (0 rows)
>
> To me that was a bit surprising. I would have expected it to fail with
> something like "can't update the same row twice in the same command".
>
> If I check the table content after the query I see the i=i+1 part was executed.
>
> Is this expected behavior?
Yes, this surprised me too. Here is a reproducible case:
CREATE TABLE tf (i INT, x TEXT);
INSERT INTO tf VALUES (1, 'x');
WITH x AS (UPDATE tf SET i=i+1 RETURNING *),
y AS (UPDATE tf SET x=x||'yy' RETURNING *)
SELECT * FROM x,y;
i | x | i | x
---+---+---+---
TABLE tf;
i | x
---+---
2 | x
I know you can cascade the returning of one table into the update of
another table, but maybe it doesn't work into the same table.
--
Bruce Momjian <bruce@momjian.us> https://momjian.us
EDB https://enterprisedb.com
Only you can decide what is important to you.