Re: We don't enforce NO SCROLL cursor restrictions
Tom Lane <tgl@sss.pgh.pa.us>
From: Tom Lane <tgl@sss.pgh.pa.us>
To: Vik Fearing <vik@postgresfriends.org>
Cc: pgsql-hackers@lists.postgresql.org
Date: 2021-09-09T18:09:58Z
Lists: pgsql-hackers
Vik Fearing <vik@postgresfriends.org> writes:
> On 9/9/21 7:10 PM, Tom Lane wrote:
>> There are probably specific cases where you do get an error,
>> but we don't have a blanket you-can't-do-that check. Should we?
> I would say yes. NO SCROLL means no scrolling; or at least should.
> On the other hand, if there is no optimization or other meaningful
> difference between SCROLL and NO SCROLL, then we can just document it as
> a no-op that is only provided for standard syntax compliance.
There are definitely optimizations that happen or don't happen
depending on the SCROLL option. I think ba2c6d6ce may be the
first patch that introduces any user-visible semantic difference,
but I'm not completely sure about that.
[ pokes at it some more ... ] Hm, we let you do this:
regression=# begin;
BEGIN
regression=*# declare c cursor for select * from int8_tbl for update;
DECLARE CURSOR
regression=*# fetch all from c;
q1 | q2
------------------+-------------------
123 | 456
123 | 4567890123456789
4567890123456789 | 123
4567890123456789 | 4567890123456789
4567890123456789 | -4567890123456789
(5 rows)
regression=*# fetch absolute 2 from c;
q1 | q2
-----+------------------
123 | 4567890123456789
(1 row)
which definitely flies in the face of the fact that we disallow
combining SCROLL and FOR UPDATE:
regression=*# declare c scroll cursor for select * from int8_tbl for update;
ERROR: DECLARE SCROLL CURSOR ... FOR UPDATE is not supported
DETAIL: Scrollable cursors must be READ ONLY.
I don't recall the exact reason for that prohibition, but I wonder
if there aren't user-visible anomalies reachable from the fact that
you can bypass it.
regards, tom lane
Commits
-
Fix some anomalies with NO SCROLL cursors.
- fa5d0415f10f 13.5 landed
- d844cd75a676 14.0 landed
- c1b7a6c27312 15.0 landed
- ba408fc960b6 12.9 landed
- 9ea8d3d24a9f 11.14 landed
-
Avoid misbehavior when persisting a non-stable cursor.
- ba2c6d6cec00 14.0 cited