• Tom Lane's avatar
    Avoid crash when rolling back within a prepared statement. · 9624321e
    Tom Lane authored
    If a portal is used to run a prepared CALL or DO statement that
    contains a ROLLBACK, PortalRunMulti fails because the portal's
    statement list gets cleared by the rollback.  (Since the grammar
    doesn't allow CALL/DO in PREPARE, the only easy way to get to this is
    via extended query protocol, which treats all inputs as prepared
    statements.)  It's difficult to avoid resetting the portal early
    because of resource-management issues, so work around this by teaching
    PortalRunMulti to be wary of portal->stmts having suddenly become NIL.
    
    The crash has only been seen to occur in v13 and HEAD (as a
    consequence of commit 1cff1b95 having added an extra touch of
    portal->stmts).  But even before that, the code involved touching a
    List that the portal no longer has any claim on.  In the test case at
    hand, the List will still exist because of another refcount on the
    cached plan; but I'm far from convinced that it's impossible for the
    cached plan to have been dropped by the time control gets back to
    PortalRunMulti.  Hence, backpatch to v11 where nested transactions
    were added.
    
    Thomas Munro and Tom Lane, per bug #16811 from James Inform
    
    Discussion: https://postgr.es/m/16811-c1b599b2c6c2d622@postgresql.org
    9624321e
pquery.c 45 KB