• Tom Lane's avatar
    Fix mis-planning of repeated application of a projection. · 6ee41a30
    Tom Lane authored
    create_projection_plan contains a hidden assumption (here made
    explicit by an Assert) that a projection-capable Path will yield a
    projection-capable Plan.  Unfortunately, that assumption is violated
    only a few lines away, by create_projection_plan itself.  This means
    that two stacked ProjectionPaths can yield an outcome where we try to
    jam the upper path's tlist into a non-projection-capable child node,
    resulting in an invalid plan.
    
    There isn't any good reason to have stacked ProjectionPaths; indeed the
    whole concept is faulty, since the set of Vars/Aggs/etc needed by the
    upper one wouldn't necessarily be available in the output of the lower
    one, nor could the lower one create such values if they weren't
    available from its input.  Hence, we can fix this by adjusting
    create_projection_path to strip any top-level ProjectionPath from the
    subpath it's given.  (This amounts to saying "oh, we changed our
    minds about what we need to project here".)
    
    The test case added here only fails in v13 and HEAD; before that, we
    don't attempt to shove the Sort into the parallel part of the plan,
    for reasons that aren't entirely clear to me.  However, all the
    directly-related code looks generally the same as far back as v11,
    where the hazard was introduced (by d7c19e62).  So I've got no faith
    that the same type of bug doesn't exist in v11 and v12, given the
    right test case.  Hence, back-patch the code changes, but not the
    irrelevant test case, into those branches.
    
    Per report from Bas Poot.
    
    Discussion: https://postgr.es/m/534fca83789c4a378c7de379e9067d4f@politie.nl
    6ee41a30
select_parallel.out 56.3 KB