Re: BUG #14421: RETURNING statement in DELETE FROM with REFERENCES - Mailing list pgsql-bugs

From David G. Johnston
Subject Re: BUG #14421: RETURNING statement in DELETE FROM with REFERENCES
Date
Msg-id CAKFQuwYrB5iyfQS6O9mmtbXP96L40BXpnFgoSj8XM88AG+5_AA@mail.gmail.com
Whole thread Raw
In response to BUG #14421: RETURNING statement in DELETE FROM with REFERENCES  (stepanperlov@gmail.com)
List pgsql-bugs
On Fri, Nov 11, 2016 at 3:27 PM, <stepanperlov@gmail.com> wrote:

> The following bug has been logged on the website:
>
> Bug reference:      14421
> Logged by:          Stepan Perlov
> Email address:      stepanperlov@gmail.com
> PostgreSQL version: 9.5.5
> Operating system:   ubuntu 14.04
> Description:
>
> Hello
>
> CREATE TABLE test(
>     id bigserial PRIMARY KEY,
>     parent bigint REFERENCES test(id) ON DELETE CASCADE ON UPDATE CASCADE
> );
> INSERT INTO test VALUES (1, null);
> INSERT INTO test VALUES (2, 1);
> INSERT INTO test VALUES (3, 2);
> INSERT INTO test VALUES (4, 2);
> INSERT INTO test VALUES (5, 2);
> INSERT INTO test VALUES (6, 2);
> INSERT INTO test VALUES (7, 2);
>
> DELETE FROM test
>    WHERE id =3D 2
>    RETURNING id;
>
> Returns:
> id
> 2
>
> I expect:
> id
> 2
> 3
> 4
> 5
> 6
> 7
>

Incorrect expectations, not a bug.

The only record deleted from the table specified in DELETE FROM "test" is
the record having id=3D2.  The fact that other records just happened to be
deleted (and just happened to be on the same table) due to a cascade
doesn't factor into it.  If you generalize to a normal DELETE/CASCADE,
where the PK is on a different table, you should understand why it doesn't
work that way.  In fact, the actions of the CASCADE triggers are invisible
when looking at the =E2=80=8Boutput of the causing command (i.e., you get D=
ELETE 1
in the command response, not DELETE 6).


https://www.postgresql.org/docs/9.6/static/sql-delete.html

=E2=80=8B"=E2=80=8B
An expression to be computed and returned by the DELETE command after each
row is deleted. The expression can use any column names of the table named
by table_name or table(s) listed in USING. Write * to return all columns.
=E2=80=8B"=E2=80=8B


David J.

pgsql-bugs by date:

Previous
From: stepanperlov@gmail.com
Date:
Subject: BUG #14421: RETURNING statement in DELETE FROM with REFERENCES
Next
From: Amit Kapila
Date:
Subject: Re: BUG #14420: Parallel worker segfault