Re: remove upsert example from docs

From: Bruce Momjian <bruce(at)momjian(dot)us>
To: Marko Tiikkaja <marko(dot)tiikkaja(at)cs(dot)helsinki(dot)fi>
Cc: Merlin Moncure <mmoncure(at)gmail(dot)com>, Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>, PostgreSQL-development <pgsql-hackers(at)postgresql(dot)org>
Subject: Re: remove upsert example from docs
Date: 2011-02-17 18:37:01
Message-ID: 201102171837.p1HIb1x18681@momjian.us
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

Marko Tiikkaja wrote:
> On 8/5/2010 9:44 PM, Merlin Moncure wrote:
> > On Thu, Aug 5, 2010 at 2:09 PM, Tom Lane<tgl(at)sss(dot)pgh(dot)pa(dot)us> wrote:
> >> I was not persuaded that there's a real bug in practice. IMO, his
> >> problem was a broken trigger not broken upsert logic. Even if we
> >> conclude this is unsafe, simply removing the example is of no help to
> >> anyone.
> >
> > Well, the error handler is assuming that the unique_volation is coming
> > from the insert made within the loop. This is obviously not a safe
> > assumption in an infinite loop context. It should be double checking
> > where the error was being thrown from -- but the only way I can think
> > of to do that is to check sqlerrm.
>
> Yeah, this is a known problem with our exception system. If there was
> an easy and reliable way of knowing where the exception came from, I'm
> sure the example would include that.
>
> > Or you arguing that if you're
> > doing this, all dependent triggers must not throw unique violations up
> > the exception chain?
>
> If he isn't, I am. I'm pretty sure you can break every example in the
> docs with a trigger (or a rule) you haven't thought through.
>
> >> A more useful response would be to supply a correct example.
> > Agree: I'd go further I would argue to supply both the 'safe' and
> > 'high concurrency (with caveat)' way. I'm not saying the example is
> > necessarily bad, just that it's maybe not a good thing to be pointing
> > as a learning example without qualifications. Then you get a lesson
> > both on upsert methods and defensive error handling (barring
> > objection, I'll provide that).
>
> The problem with the "safe" way is that it's not safe if called in a
> transaction with isolation level set to SERIALIZABLE.

Good analysis. Documentation patch attached and applied.

--
Bruce Momjian <bruce(at)momjian(dot)us> http://momjian.us
EnterpriseDB http://enterprisedb.com

+ It's impossible for everything to be true. +

Attachment Content-Type Size
/rtmp/upsert.diff text/x-diff 1.2 KB

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Robert Haas 2011-02-17 18:43:35 Re: contrib loose ends: 9.0 to 9.1 incompatibilities
Previous Message Bruce Momjian 2011-02-17 18:25:18 Re: Rewrite, normal execution vs. EXPLAIN ANALYZE