BUG #15007: LIMIT not respected in sub-queries

Поиск
Список
Период
Сортировка
От PG Bug reporting form
Тема BUG #15007: LIMIT not respected in sub-queries
Дата
Msg-id 20180111211642.1407.23425@wrigleys.postgresql.org
обсуждение исходный текст
Ответы Re: BUG #15007: LIMIT not respected in sub-queries  (Tomas Vondra <tomas.vondra@2ndquadrant.com>)
Список pgsql-bugs
The following bug has been logged on the website:

Bug reference:      15007
Logged by:          Will Storey
Email address:      will@summercat.com
PostgreSQL version: 10.1
Operating system:   Ubuntu 16.04
Description:

Hello,

I am not sure this is a bug. But it is surprising to me and seems to
contradict the documentation in terms of join nesting.

I have a SELECT query with a sub-SELECT in it. The sub-SELECT has a LIMIT
clause. I've found that sometimes I receive more rows (at most one extra in
my testing) than the LIMIT, where I expected only as many rows as the LIMIT.
This depends on the query plan. With some plans it never happens, and with
others it happens frequently.

In looking into this behaviour, I came across hints that this is a known
quirk. I found bug reports related specifically to UPDATE/DELETE that sound
similar to this, but no mention that the behaviour can happen with SELECT:

https://dba.stackexchange.com/questions/69471/postgres-update-limit-1?noredirect=1&lq=1
(note the comments on the accepted answer)
https://www.postgresql.org/message-id/1399649764731-5803406.post%40n5.nabble.com
(and the thread)
https://www.postgresql.org/message-id/1385918761589-5781081.post%40n5.nabble.com

This happens with both PostgreSQL 10.1 on Ubuntu 16.04 (from the PostgreSQL
repos: PostgreSQL 10.1 on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu
5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609, 64-bit) as well as on PostgreSQL
9.6.5 (where I initially encountered the behaviour).

Unfortunately my test case is not very clean and it is somewhat long, so
I've put it in a gist on GitHub:

https://gist.github.com/horgh/f3e8ede81d866844e7d162d677968bf0

The SELECT query (run by the Perl program) quickly prints out that it
receives 6 rows.

As you can see in the EXPLAIN ANALYZE output, the innermost Nested Loop has
loops > 1. I believe this is the cause of the behaviour. If I tweak the test
to have a plan where that node runs before the Seq Scan, there are never
more than 5 rows.

I believe a better way to write this query would be to use a CTE.

Thank you for your time!


В списке pgsql-bugs по дате отправления:

Предыдущее
От: PG Bug reporting form
Дата:
Сообщение: BUG #15006: "make check" error if current user is "user"
Следующее
От: David Gould
Дата:
Сообщение: Re: BUG #15005: ANALYZE can make pg_class.reltuples inaccurate.