Thread
Commits
-
Calculate extraUpdatedCols in query rewriter, not parser.
- ad77039fad0f 14.0 landed
- 70492195be5e 13.1 landed
- 43330cdd40f1 12.5 landed
-
Optimize update of tables with generated columns
- c6679e4fca21 13.0 cited
-
BUG #16671: "generated always as" is ignored when updating table through view
The Post Office <noreply@postgresql.org> — 2020-10-14T20:30:55Z
The following bug has been logged on the website: Bug reference: 16671 Logged by: Michael Paul Killian Email address: rad@killian.email PostgreSQL version: 13.0 Operating system: macOS 10.13 Description: consider running this script to see what I mean: ``` CREATE TABLE public.table1 ( id serial, idplus1 integer GENERATED ALWAYS AS (id + 1) STORED ); CREATE VIEW public.view1 AS SELECT * FROM public.table1; INSERT INTO public.table1 (id, idplus1) VALUES (DEFAULT, DEFAULT); INSERT INTO public.view1 (id, idplus1) VALUES (DEFAULT, DEFAULT); INSERT INTO public.table1 (id, idplus1) VALUES (DEFAULT, DEFAULT); INSERT INTO public.view1 (id, idplus1) VALUES (DEFAULT, DEFAULT); INSERT INTO public.table1 (id, idplus1) VALUES (DEFAULT, DEFAULT); INSERT INTO public.view1 (id, idplus1) VALUES (DEFAULT, DEFAULT); UPDATE view1 SET id = 3000 WHERE id = 3; UPDATE view1 SET id = 4000 WHERE id = 4; UPDATE table1 SET id = 5000 WHERE id = 5; UPDATE table1 SET id = 6000 WHERE id = 6; select * from table1; ``` I expected the following output from the last line: id | idplus1 ------+--------- 1 | 2 2 | 3 3000 | 3001 4000 | 4001 5000 | 5001 6000 | 6001 (6 rows) but instead I got: id | idplus1 ------+--------- 1 | 2 2 | 3 3000 | 4 4000 | 5 5000 | 5001 6000 | 6001 (6 rows) I could be ignorant of some limitations that views have, but I have neither looked for them nor seen them in the documentation. I just assumed in good faith that updating rows through a view would be safe in simple cases. Is this a dangerous assumption? -
Re: BUG #16671: "generated always as" is ignored when updating table through view
Tom Lane <tgl@sss.pgh.pa.us> — 2020-10-14T21:49:34Z
PG Bug reporting form <noreply@postgresql.org> writes: > [ updating via a view fails to recalculate GENERATED columns ] Yeah, that's surely a bug. In fact, it's a regression, because the test case works as-expected in v12. Not sure where we broke it. > I could be ignorant of some limitations that views have, but I have neither > looked for them nor seen them in the documentation. I just assumed in good > faith that updating rows through a view would be safe in simple cases. Is > this a dangerous assumption? Assuming that a dot-zero release is bug-free can be dangerous :-( regards, tom lane
-
Re: BUG #16671: "generated always as" is ignored when updating table through view
Tom Lane <tgl@sss.pgh.pa.us> — 2020-10-14T22:45:53Z
I wrote: > PG Bug reporting form <noreply@postgresql.org> writes: >> [ updating via a view fails to recalculate GENERATED columns ] > Yeah, that's surely a bug. In fact, it's a regression, because > the test case works as-expected in v12. Not sure where we broke it. git bisect blames c6679e4fca21d253ced84c51ac1a31c1b2aec72f is the first bad commit commit c6679e4fca21d253ced84c51ac1a31c1b2aec72f Author: Peter Eisentraut <peter@eisentraut.org> Date: Mon Feb 17 15:19:58 2020 +0100 Optimize update of tables with generated columns When updating a table row with generated columns, only recompute those generated columns whose base columns have changed in this update and keep the rest unchanged. This can result in a significant performance benefit. The required information was already kept in RangeTblEntry.extraUpdatedCols; we just have to make use of it. Reviewed-by: Pavel Stehule <pavel.stehule@gmail.com> Discussion: https://www.postgresql.org/message-id/flat/b05e781a-fa16-6b52-6738-761181204567@2ndquadrant.com regards, tom lane -
Re: BUG #16671: "generated always as" is ignored when updating table through view
Tom Lane <tgl@sss.pgh.pa.us> — 2020-10-27T23:38:08Z
I wrote: >> PG Bug reporting form <noreply@postgresql.org> writes: >>> [ updating via a view fails to recalculate GENERATED columns ] >> Yeah, that's surely a bug. In fact, it's a regression, because >> the test case works as-expected in v12. Not sure where we broke it. > git bisect blames > c6679e4fca21d253ced84c51ac1a31c1b2aec72f is the first bad commit On digging into this, I see that it's one of the issues I complained about in [1]. Here is a patch that proposes to fix that by moving calculation of extraUpdatedCols into the query rewriter. (With this patch, stored extraUpdatedCols values would always be null. But it wouldn't matter if we are working with a rule in which the field isn't null, since the rewriter would just overwrite it.) regards, tom lane [1] https://www.postgresql.org/message-id/2351.1589824639%40sss.pgh.pa.us