• Tom Lane's avatar
    Make postgres_fdw's "Relations" output agree with the rest of EXPLAIN. · 4526951d
    Tom Lane authored
    The relation aliases shown in the "Relations" line for a foreign scan
    didn't always agree with those used in the rest of EXPLAIN's output.
    The regression test result changes appearing here provide examples.
    
    It's really impossible for postgres_fdw to duplicate EXPLAIN's alias
    assignment logic during postgresGetForeignRelSize(), because of the
    de-duplication that EXPLAIN does on a global basis --- and anyway,
    trying to duplicate that would be unmaintainable.  Instead, just put
    numeric rangetable indexes into the string, and convert those to
    table names/aliases in postgresExplainForeignScan, which does have
    access to the results of ruleutils.c's alias assignment logic.
    Aside from being more reliable, this shifts some work from planning
    to EXPLAIN, which is a good tradeoff for performance.  (I also
    changed from using StringInfo to using psprintf, which makes the
    code slightly simpler and reduces its memory consumption.)
    
    A kluge required by this solution is that we have to reverse-engineer
    the rtoffset applied by setrefs.c.  If that logic ever fails
    (presumably because the member tables of a join got offset by
    different amounts), we'll need some more cooperation with setrefs.c
    to keep things straight.  But for now, there's no need for that.
    
    Arguably this is a back-patchable bug fix, but since this is a mostly
    cosmetic issue and there have been no field complaints, I'll refrain
    for now.
    
    Discussion: https://postgr.es/m/12424.1575168015@sss.pgh.pa.us
    4526951d
postgres_fdw.c 198 KB