• Tom Lane's avatar
    Fix some anomalies with NO SCROLL cursors. · d844cd75
    Tom Lane authored
    We have long forbidden fetching backwards from a NO SCROLL cursor,
    but the prohibition didn't extend to cases in which we rewind the
    query altogether and then re-fetch forwards.  I think the reason is
    that this logic was mainly meant to protect plan nodes that can't
    be run in the reverse direction.  However, re-reading the query output
    is problematic if the query is volatile (which includes SELECT FOR
    UPDATE, not just queries with volatile functions): the re-read can
    produce different results, which confuses the cursor navigation logic
    completely.  Another reason for disliking this approach is that some
    code paths will either fetch backwards or rewind-and-fetch-forwards
    depending on the distance to the target row; so that seemingly
    identical use-cases may or may not draw the "cursor can only scan
    forward" error.  Hence, let's clean things up by disallowing rewind
    as well as fetch-backwards in a NO SCROLL cursor.
    
    Ordinarily we'd only make such a definitional change in HEAD, but
    there is a third reason to consider this change now.  Commit ba2c6d6c
    created some new user-visible anomalies for non-scrollable cursors
    WITH HOLD, in that navigation in the cursor result got confused if the
    cursor had been partially read before committing.  The only good way
    to resolve those anomalies is to forbid rewinding such a cursor, which
    allows removal of the incorrect cursor state manipulations that
    ba2c6d6c added to PersistHoldablePortal.
    
    To minimize the behavioral change in the back branches (including
    v14), refuse to rewind a NO SCROLL cursor only when it has a holdStore,
    ie has been held over from a previous transaction due to WITH HOLD.
    This should avoid breaking most applications that have been sloppy
    about whether to declare cursors as scrollable.  We'll enforce the
    prohibition across-the-board beginning in v15.
    
    Back-patch to v11, as ba2c6d6c was.
    
    Discussion: https://postgr.es/m/3712911.1631207435@sss.pgh.pa.us
    d844cd75
portalcmds.c 13.3 KB