• Tom Lane's avatar
    Call set_rel_pathlist_hook before generate_gather_paths, not after. · 64015838
    Tom Lane authored
    The previous ordering of these steps satisfied the nominal requirement
    that set_rel_pathlist_hook could editorialize on the whole set of Paths
    constructed for a base relation.  In practice, though, trying to change
    the set of partial paths was impossible.  Adding one didn't work because
    (a) it was too late to be included in Gather paths made by the core code,
    and (b) calling add_partial_path after generate_gather_paths is unsafe,
    because it might try to delete a path it thinks is dominated, but that
    is already embedded in some Gather path(s).  Nor could the hook safely
    remove partial paths, for the same reason that they might already be
    embedded in Gathers.
    
    Better to call extensions first, let them add partial paths as desired,
    and then gather.  In v11 and up, we already doubled down on that ordering
    by postponing gathering even further for single-relation queries; so even
    if the hook wished to editorialize on Gather path construction, it could
    not.
    
    Report and patch by KaiGai Kohei.  Back-patch to 9.6 where Gather paths
    were added.
    
    Discussion: https://postgr.es/m/CAOP8fzahwpKJRTVVTqo2AE=mDTz_efVzV6Get_0=U3SO+-ha1A@mail.gmail.com
    64015838
allpaths.c 122 KB