Re: Undocumented count in FORWARD/BACKWARD direction of MOVE statement

From: Philipp Salvisberg <philipp(dot)salvisberg(at)gmail(dot)com>
To: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
Cc: pgsql-docs(at)lists(dot)postgresql(dot)org
Subject: Re: Undocumented count in FORWARD/BACKWARD direction of MOVE statement
Date: 2024-07-22 17:49:40
Message-ID: A8243675-06E2-4591-AF12-10C4A7BD3A82@gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-docs


> On 22 Jul 2024, at 18:24, Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us> wrote:
>
> PG Doc comments form <noreply(at)postgresql(dot)org> writes:
>> The following documentation comment has been logged on the website:
>> Page: https://www.postgresql.org/docs/16/plpgsql-cursors.html
>> Description:
>
>> The documentation shows this example for the MOVE statement:
>
>> MOVE FORWARD 2 FROM curs4;
>
>> According to the docs, this should not work. The count is documented only
>> for the directions ABSOLUTE and RELATIVE (which should be enough). "FORWARD
>> count" and "BACKWARD" count works in MOVE but not in FETCH. I don't know if
>> this is intentional. However, the docs do not seem to be correct for MOVE
>> directions.
>
> Yeah, you're right. MOVE does not have the restriction about not
> taking forms of "direction" that specify multiple rows. But the
> docs just refer you to FETCH which does have that restriction,
> so unless you read that as referring to SQL FETCH it's wrong.
>
> I also notice this comment in pl_gram.y:
>
> /*
> * Assume it's a count expression with no preceding keyword.
> * Note: we allow this syntax because core SQL does, but we don't
> * document it because of the ambiguity with the omitted-direction
> * case. For instance, "MOVE n IN c" will fail if n is a variable.
> * Perhaps this can be improved someday, but it's hardly worth a
> * lot of work.
> */
>
> It seems to me that it'd be better to surface that in the docs,
> that is describe the case as deprecated.
>
> So maybe something like
>
> MOVE repositions a cursor without retrieving any data.
> MOVE works like the FETCH command, except it only repositions the
> cursor and does not return the row moved to.
> The direction clause can be any of the variants allowed in the SQL
> FETCH command, including those that would fetch more than one row;
> the cursor is positioned to the last such row.
> However, the case in which the direction clause is simply a count
> expression without a keyword is deprecated. (It is ambiguous with
> the case where the direction clause is omitted altogether, and
> hence may fail if the count is not a constant.)
> As with SELECT INTO,
> the special variable FOUND can be checked to see whether there was
> a row to move to.
>
> regards, tom lane

Yes, that's clearer. Especially referring to SQL FETCH instead of FETCH helps. Therefore I would change FETCH to SQL FETCH also in your second paragraph.

I read FETCH in the current documentation as PL/pgSQL FETCH and therefore checked the list of directions mentioned in the previous chapter.

Thanks, Philipp

In response to

Browse pgsql-docs by date

  From Date Subject
Next Message Michael Paquier 2024-07-22 23:39:20 Re: Undocumented optionality of handler_statements
Previous Message Tom Lane 2024-07-22 16:24:35 Re: Undocumented count in FORWARD/BACKWARD direction of MOVE statement