Re: Remembering bug #6123 - Mailing list pgsql-hackers

From Kevin Grittner
Subject Re: Remembering bug #6123
Date
Msg-id 4F102A9702000025000447A3@gw.wicourts.gov
Whole thread Raw
In response to Re: Remembering bug #6123  (Tom Lane <tgl@sss.pgh.pa.us>)
Responses Re: Remembering bug #6123  (Tom Lane <tgl@sss.pgh.pa.us>)
List pgsql-hackers
Tom Lane <tgl@sss.pgh.pa.us> wrote:
> I worked over this patch a bit, mostly cosmetically; updated
> version attached.
Thanks!
> However, we're not there yet.  I have a couple of remaining
> concerns:
> 
> 1. I think the error message needs more thought.  I believe it's
> possible to trigger this error not only with BEFORE triggers, but
> also with a volatile function used in the query that reaches
> around and updates row(s) of the target table.  Now, I don't have
> the slightest qualms about breaking any apps that do anything so
> dirty, but should we try to generalize the message text to cope
> with that?
I hadn't thought of that, but it does seem possible.  Maybe after
dealing with the other points, I'll work on a test case to show that
behavior.
I'm also fine with generating an error for such dirty tricks, and I
agree that if that's indeed possible we should make the message
general enough to cover that case.  Nothing comes to mind at the
moment, but I'll think on it.
> 2. The HINT needs work too, as it seems pretty useless as it
> stands.  I'd have expected some short reference to the technique
> of re-executing the update in the trigger and then returning NULL.
In the previous (rather long) thread on the topic, it seemed that
most cases where people have hit this, the problem was easily solved
by moving the offending code to the AFTER trigger.  The technique of
re-issuing the command didn't turn up until much later.  I would bet
it will be the right thing to do 20% of the time when people get
such an error.  I don't want to leave the 80% solution out of the
hint, but if you don't think it's too verbose, I guess it would be a
good thing to mention the 20% solution, too.
> (BTW, does this patch require any documentation changes, and if so
> where?)
I've been wondering that.  Perhaps a paragraph or two with an
example on this page?:
http://www.postgresql.org/docs/devel/static/trigger-definition.html
> 3. I modified heap_lock_tuple to also return a
> HeapUpdateFailureData, principally on the grounds that its API
> should be largely parallel to heap_update, but having done that I
> can't help wondering whether its callers are okay with skipping
> self-updated tuples.  I see that you changed EvalPlanQualFetch,
> but I'm not entirely sure that that is right; shouldn't it
> continue to ignore rows modified by the current command itself?
I made that change when working on the approach where "safe"
conflicts (like a DELETE from within the BEFORE DELETE trigger) were
quietly ignored.  Without that change, it didn't see the end of the
ctid chain, and didn't behave correctly.  I've been wondering if it
is still needed.  I had been planning to create a test case to try
to show that it was.  Maybe an UPDATE with a join to force multiple
row updates from the "primary" statement, followed by a triggered
UPDATE to the row.  If that doesn't need the EvalPlanQualFetch
change, I don't know what would.
> And you did not touch the other two callers, which definitely
> have got issues.  Here is an example
> [example]
> I'm not sure what to do about this.  If we throw an error there,
> there will be no way that the trigger can override the error
> because it will never get to run.  Possibly we could plow ahead
> with the expectation of throwing an error later if the trigger
> doesn't cancel the update/delete, but is it safe to do so if we
> don't hold lock on the tuple?  In any case that idea doesn't help
> with the remaining caller, ExecLockRows.
It will take me some time to work though the example and review the
relevant code.
-Kevin


pgsql-hackers by date:

Previous
From: Tom Lane
Date:
Subject: Re: Remembering bug #6123
Next
From: Andrew Dunstan
Date:
Subject: Re: reprise: pretty print viewdefs