• Tom Lane's avatar
    Shut down EvalPlanQual machinery when LockRows node reaches the end. · bb4aed46
    Tom Lane authored
    Previously, we left the EPQ sub-executor alone until ExecEndLockRows.
    This caused any buffer pins or other resources that it might hold to
    remain held until ExecutorEnd, which in some code paths means that
    they are held till the Portal is closed.  That can cause user-visible
    problems, such as blocking VACUUM; and it's unlike the behavior of
    ordinary table-scanning nodes, which will have released all buffer
    pins by the time they return an EOF indication.
    
    We can make LockRows work more like other plan nodes by calling
    EvalPlanQualEnd just before returning NULL.  We still need to call it
    in ExecEndLockRows in case the node was not run to completion, but in
    the normal case the second call does nothing and costs little.
    
    Per report from Yura Sokolov.  In principle this is a longstanding
    bug, but in view of the lack of other complaints and the low severity
    of the consequences, I chose not to back-patch.
    
    Discussion: https://postgr.es/m/4aa370cb91ecf2f9885d98b80ad1109c@postgrespro.ru
    bb4aed46
nodeLockRows.c 10.5 KB