• Tom Lane's avatar
    Fix failure with initplans used conditionally during EvalPlanQual rechecks. · 1f4a920b
    Tom Lane authored
    The EvalPlanQual machinery assumes that any initplans (that is,
    uncorrelated sub-selects) used during an EPQ recheck would have already
    been evaluated during the main query; this is implicit in the fact that
    execPlan pointers are not copied into the EPQ estate's es_param_exec_vals.
    But it's possible for that assumption to fail, if the initplan is only
    reached conditionally.  For example, a sub-select inside a CASE expression
    could be reached during a recheck when it had not been previously, if the
    CASE test depends on a column that was just updated.
    
    This bug is old, appearing to date back to my rewrite of EvalPlanQual in
    commit 9f2ee8f2, but was not detected until Kyle Samson reported a case.
    
    To fix, force all not-yet-evaluated initplans used within the EPQ plan
    subtree to be evaluated at the start of the recheck, before entering the
    EPQ environment.  This could be inefficient, if such an initplan is
    expensive and goes unused again during the recheck --- but that's piling
    one layer of improbability atop another.  It doesn't seem worth adding
    more complexity to prevent that, at least not in the back branches.
    
    It was convenient to use the new-in-v11 ExecEvalParamExecParams function
    to implement this, but I didn't like either its name or the specifics of
    its API, so revise that.
    
    Back-patch all the way.  Rather than rewrite the patch to avoid depending
    on bms_next_member() in the oldest branches, I chose to back-patch that
    function into 9.4 and 9.3.  (This isn't the first time back-patches have
    needed that, and it exhausted my patience.)  I also chose to back-patch
    some test cases added by commits 71404af2 and 342a1ffa into 9.4 and 9.3,
    so that the 9.x versions of eval-plan-qual.spec are all the same.
    
    Andrew Gierth diagnosed the problem and contributed the added test cases,
    though the actual code changes are by me.
    
    Discussion: https://postgr.es/m/A033A40A-B234-4324-BE37-272279F7B627@tripadvisor.com
    1f4a920b
nodeSubplan.c 40.4 KB