Re: Strang behaviour SELECT ... LIMIT n FOR UPDATE

From: Bruce Momjian <bruce(at)momjian(dot)us>
To: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
Cc: Daniel Caune <daniel(dot)caune(at)ubisoft(dot)com>, pgsql-sql(at)postgresql(dot)org
Subject: Re: Strang behaviour SELECT ... LIMIT n FOR UPDATE
Date: 2007-11-28 04:50:51
Message-ID: 200711280450.lAS4opo18455@momjian.us
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-sql

Tom Lane wrote:
> "Daniel Caune" <daniel(dot)caune(at)ubisoft(dot)com> writes:
> > I'm facing a strange behaviour with a statement SELECT ... LIMIT n FOR
> > UPDATE in PostgreSQL 8.1. The number of rows returned is actually (n -
> > 1). I'm trying to find whether this is an identified issue with
> > PostgreSQL 8.1 that might have been fixed in a later version such as
> > 8.2; I don't have any problem in moving to a later version if needed.
>
> There's no known issue specifically of that form (and a quick test of
> 8.1 doesn't reproduce any such behavior). However, it is known and
> documented that LIMIT and FOR UPDATE behave rather oddly together:
> the LIMIT is applied first, which means that if FOR UPDATE rejects
> any rows as being no longer up-to-date, you get fewer than the expected
> number of rows out. You did not mention any concurrent activity in
> your example, but I'm betting there was some ...

Current documentation explains why in the SELECT manual page:

It is possible for a <command>SELECT</> command using both
<literal>LIMIT</literal> and <literal>FOR UPDATE/SHARE</literal>
clauses to return fewer rows than specified by
<literal>LIMIT</literal>. This is because <literal>LIMIT</> is applied
first. The command selects the specified number of rows, but might
then block trying to obtain lock on one or more of them. Once the
<literal>SELECT</> unblocks, the row might have been deleted or updated
so that it does not meet the query <literal>WHERE</> condition anymore,
in which case it will not be returned.

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

+ If your life is a hard drive, Christ can be your backup. +

In response to

Browse pgsql-sql by date

  From Date Subject
Next Message John van Zantvoort 2007-11-28 15:13:16 obtaining column names from tables or views
Previous Message Tom Lane 2007-11-28 04:46:29 Re: Strang behaviour SELECT ... LIMIT n FOR UPDATE