• Tom Lane's avatar
    Fix PARAM_EXEC assignment mechanism to be safe in the presence of WITH. · 46c508fb
    Tom Lane authored
    The planner previously assumed that parameter Vars having the same absolute
    query level, varno, and varattno could safely be assigned the same runtime
    PARAM_EXEC slot, even though they might be different Vars appearing in
    different subqueries.  This was (probably) safe before the introduction of
    CTEs, but the lazy-evalution mechanism used for CTEs means that a CTE can
    be executed during execution of some other subquery, causing the lifespan
    of Params at the same syntactic nesting level as the CTE to overlap with
    use of the same slots inside the CTE.  In 9.1 we created additional hazards
    by using the same parameter-assignment technology for nestloop inner scan
    parameters, but it was broken before that, as illustrated by the added
    regression test.
    
    To fix, restructure the planner's management of PlannerParamItems so that
    items having different semantic lifespans are kept rigorously separated.
    This will probably result in complex queries using more runtime PARAM_EXEC
    slots than before, but the slots are cheap enough that this hardly matters.
    Also, stop generating PlannerParamItems containing Params for subquery
    outputs: all we really need to do is reserve the PARAM_EXEC slot number,
    and that now only takes incrementing a counter.  The planning code is
    simpler and probably faster than before, as well as being more correct.
    
    Per report from Vik Reykja.
    
    These changes will mostly also need to be made in the back branches, but
    I'm going to hold off on that until after 9.2.0 wraps.
    46c508fb
createplan.c 137 KB