Thread: BUG #14421: RETURNING statement in DELETE FROM with REFERENCES

BUG #14421: RETURNING statement in DELETE FROM with REFERENCES

From
stepanperlov@gmail.com
Date:
VGhlIGZvbGxvd2luZyBidWcgaGFzIGJlZW4gbG9nZ2VkIG9uIHRoZSB3ZWJz
aXRlOgoKQnVnIHJlZmVyZW5jZTogICAgICAxNDQyMQpMb2dnZWQgYnk6ICAg
ICAgICAgIFN0ZXBhbiBQZXJsb3YKRW1haWwgYWRkcmVzczogICAgICBzdGVw
YW5wZXJsb3ZAZ21haWwuY29tClBvc3RncmVTUUwgdmVyc2lvbjogOS41LjUK
T3BlcmF0aW5nIHN5c3RlbTogICB1YnVudHUgMTQuMDQKRGVzY3JpcHRpb246
ICAgICAgICAKCkhlbGxvDQoNCkNSRUFURSBUQUJMRSB0ZXN0KA0KICAgIGlk
IGJpZ3NlcmlhbCBQUklNQVJZIEtFWSwNCiAgICBwYXJlbnQgYmlnaW50IFJF
RkVSRU5DRVMgdGVzdChpZCkgT04gREVMRVRFIENBU0NBREUgT04gVVBEQVRF
IENBU0NBREUNCik7DQpJTlNFUlQgSU5UTyB0ZXN0IFZBTFVFUyAoMSwgbnVs
bCk7DQpJTlNFUlQgSU5UTyB0ZXN0IFZBTFVFUyAoMiwgMSk7DQpJTlNFUlQg
SU5UTyB0ZXN0IFZBTFVFUyAoMywgMik7DQpJTlNFUlQgSU5UTyB0ZXN0IFZB
TFVFUyAoNCwgMik7DQpJTlNFUlQgSU5UTyB0ZXN0IFZBTFVFUyAoNSwgMik7
DQpJTlNFUlQgSU5UTyB0ZXN0IFZBTFVFUyAoNiwgMik7DQpJTlNFUlQgSU5U
TyB0ZXN0IFZBTFVFUyAoNywgMik7DQoNCkRFTEVURSBGUk9NIHRlc3QNCiAg
IFdIRVJFIGlkID0gMg0KICAgUkVUVVJOSU5HIGlkOw0KDQpSZXR1cm5zOg0K
aWQNCjINCg0KSSBleHBlY3Q6DQppZA0KMg0KMw0KNA0KNQ0KNg0KNw0KDQpU
aGFua3MKCg==

Re: BUG #14421: RETURNING statement in DELETE FROM with REFERENCES

From
"David G. Johnston"
Date:
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.