• Tom Lane's avatar
    Split create_foreignscan_path() into three functions. · 34ea1ab7
    Tom Lane authored
    Up to now postgres_fdw has been using create_foreignscan_path() to
    generate not only base-relation paths, but also paths for foreign joins
    and foreign upperrels.  This is wrong, because create_foreignscan_path()
    calls get_baserel_parampathinfo() which will only do the right thing for
    baserels.  It accidentally fails to fail for unparameterized paths, which
    are the only ones postgres_fdw (thought it) was handling, but we really
    need different APIs for the baserel and join cases.
    
    In HEAD, the best thing to do seems to be to split up the baserel,
    joinrel, and upperrel cases into three functions so that they can
    have different APIs.  I haven't actually given create_foreign_join_path
    a different API in this commit: we should spend a bit of time thinking
    about just what we want to do there, since perhaps FDWs would want to
    do something different from the build-up-a-join-pairwise approach that
    get_joinrel_parampathinfo expects.  In the meantime, since postgres_fdw
    isn't prepared to generate parameterized joins anyway, just give it a
    defense against trying to plan joins with lateral refs.
    
    In addition (and this is what triggered this whole mess) fix bug #15613
    from Srinivasan S A, by teaching file_fdw and postgres_fdw that plain
    baserel foreign paths still have outer refs if the relation has
    lateral_relids.  Add some assertions in relnode.c to catch future
    occurrences of the same error --- in particular, to catch other FDWs
    doing that, but also as backstop against core-code mistakes like the
    one fixed by commit bdd9a99a.
    
    Bug #15613 also needs to be fixed in the back branches, but the
    appropriate fix will look quite a bit different there, since we don't
    want to assume that existing FDWs get the word right away.
    
    Discussion: https://postgr.es/m/15613-092be1be9576c728@postgresql.org
    34ea1ab7
pathnode.h 11.2 KB