Re: Parameters don't work in FETCH NEXT clause?

Поиск
Список
Период
Сортировка
От David G. Johnston
Тема Re: Parameters don't work in FETCH NEXT clause?
Дата
Msg-id CAKFQuwYkGMM992GEZo7h69ECCzrJx=Q3ZMavrZ0GuZaetBY+rA@mail.gmail.com
обсуждение исходный текст
Ответ на Re: Parameters don't work in FETCH NEXT clause?  (Shay Rojansky <roji@roji.org>)
Ответы Re: Parameters don't work in FETCH NEXT clause?  (Shay Rojansky <roji@roji.org>)
Список pgsql-hackers
On Tue, May 17, 2016 at 12:15 PM, Shay Rojansky <roji@roji.org> wrote:
Apologies, as usual I didn't read the docs carefully enough.

On Tue, May 17, 2016 at 7:13 PM, Tom Lane <tgl@sss.pgh.pa.us> wrote:
Shay Rojansky <roji@roji.org> writes:
> A user of mine just raised a strange issue... While it is possible to use a
> parameter in a LIMIT clause, PostgreSQL does not seem to allow using one in
> a FETCH NEXT clause. In other words, while the following works:
> SELECT 1 LIMIT $1;
> The following generates a syntax error:
> SELECT 1 FETCH NEXT $1 ROWS ONLY;
> Since LIMIT and FETCH NEXT are supposed to be equivalent this behavior is
> odd.

Per the SELECT reference page:

    SQL:2008 introduced a different syntax to achieve the same result,
    which PostgreSQL also supports. It is:

        OFFSET start { ROW | ROWS }
        FETCH { FIRST | NEXT } [ count ] { ROW | ROWS } ONLY

    In this syntax, to write anything except a simple integer constant for
    start or count, you must write parentheses around it.

The comments about this in gram.y are informative:

 * Allowing full expressions without parentheses causes various parsing
 * problems with the trailing ROW/ROWS key words.  SQL only calls for
 * constants, so we allow the rest only with parentheses.  If omitted,
 * default to 1.

​Would something like this be valid?

OFFSET { start_literal | ( start_expression ) } { ROW | ROWS }
FETCH { FIRST | NEXT} [ count_literal | ( count_expression ) ] { ROW | ROWS } ONLY

Leaving the mandatory parentheses detail to the description, while adequate, seems insufficient - especially when a normal LIMIT expression is not so restricted.

​And don't you think the section header would be more accurately named:

Limit, Offset & Fetch Clauses

​The nuance regarding "different standard syntax" is unknown to the reader who first looks at the syntax and sees three different lines, one for each clause, and then scrolls down looking at headers until they find the section for the clause they are interested in.  That FETCH is an alias for LIMIT ​is not something that I immediately understood - though to be honest I don't think I comprehended the presence of FETCH on a SELECT query at all and thought it only pertained to cursors....

David J.


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

Предыдущее
От: Dmitry Dolgov
Дата:
Сообщение: Jsonb array-style subscripting, generic version
Следующее
От: Tom Lane
Дата:
Сообщение: Re: seg fault in contrib/bloom