From: | Marti Raudsepp <marti(at)juffo(dot)org> |
---|---|
To: | Peter Geoghegan <pg(at)heroku(dot)com> |
Cc: | Kevin Grittner <kgrittn(at)ymail(dot)com>, Robert Haas <robertmhaas(at)gmail(dot)com>, Pg Hackers <pgsql-hackers(at)postgresql(dot)org>, Simon Riggs <simon(at)2ndquadrant(dot)com>, Andres Freund <andres(at)2ndquadrant(dot)com> |
Subject: | Re: UPSERT wiki page, and SQL MERGE syntax |
Date: | 2014-10-09 00:37:24 |
Message-ID: | CABRT9RA4HiEW-04GrFutcT5HmpmE3Mwmjqtswajgfg5UU8Gw4A@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-hackers |
On Thu, Oct 9, 2014 at 2:46 AM, Peter Geoghegan <pg(at)heroku(dot)com> wrote:
>> Indeed, the current behavior breaks even the canonical "keep track of
>> how many posts are in a thread" trigger example
> use an AFTER trigger for this kind of thing, and all of these
> issues go away.
In the latest patches from CommitFest, the UPDATE case invokes
BEFORE&AFTER INSERT triggers, not AFTER UPDATE. Is that going to be
changed? If so, I concede that.
>> I proposed an alternative that avoids this surprise and might allow
>> some other benefits. Can you please look into that?
>
> I looked at that.
Thanks!
> You're talking about making the case where before
> row triggers clearly are appropriate (when you just want to change the
> tuple being inserted) fail
Only in case the trigger changes *key* columns necessary for atomicity
(i.e. from the WITHIN index). Other columns are fair game. The
restriction seems justifiable to me: it's unreasonable to be atomic
with respect to values that change mid-way.
* It can distinguish between BEFORE INSERT and BEFORE UPDATE triggers,
which your approach fundamentally cannot.
* It can probably avoid evaluating column defaults in the UPDATE case,
like nextval() for unrelated serial columns => reduced overhead
* The semantics match better with MERGE-like syntax that seems to come
up again and again.
* And it appears to solve (part?) of the problem you had with naming
key *colums* in the WITHIN clause, rather than using index name.
If you don't see any reasons why it can't be done, these benefits seem
clear to me. I think the tradeoffs at least warrant wider discussion.
Regards,
Marti
From | Date | Subject | |
---|---|---|---|
Next Message | Peter Geoghegan | 2014-10-09 00:47:45 | Re: UPSERT wiki page, and SQL MERGE syntax |
Previous Message | Fabrízio de Royes Mello | 2014-10-09 00:31:54 | Re: pgaudit - an auditing extension for PostgreSQL |