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  <br...@momjian.us>        https://momjian.us
  EDB                                      https://enterprisedb.com

  Only you can decide what is important to you.


Reply via email to