• Tom Lane's avatar
    Handle restriction clause lists more uniformly in postgres_fdw. · 28b04787
    Tom Lane authored
    Clauses in the lists retained by postgres_fdw during planning were
    sometimes bare boolean clauses, sometimes RestrictInfos, and sometimes
    a mixture of the two in the same list.  The comment about that situation
    didn't come close to telling the full truth, either.  Aside from being
    confusing, this had a couple of bad practical consequences:
    * waste of planning cycles due to inability to cache per-clause selectivity
    and cost estimates;
    * sometimes, RestrictInfos would sneak into the fdw_private list of a
    finished Plan node, causing failures if, for example, we tried to ship
    the Plan tree to a parallel worker.
    (It may well be that it's a bug in the parallel-query logic that we
    would ever try to ship such a plan to a parallel worker, but in any
    case this deserves to be cleaned up.)
    
    To fix, rearrange so that clause lists in PgFdwRelationInfo are always
    lists of RestrictInfos, and then strip the RestrictInfos at the last
    minute when making a Plan node.  In passing do a bit of refactoring and
    comment cleanup in postgresGetForeignPlan and foreign_join_ok.
    
    Although the messiness here dates back at least to 9.6, there's no evidence
    that it causes anything worse than wasted planning cycles in 9.6, so no
    back-patch for now.
    
    Per fuzz testing by Andreas Seltenreich.
    
    Tom Lane and Ashutosh Bapat
    
    Discussion: https://postgr.es/m/87tw5x4vcu.fsf@credativ.de
    28b04787
postgres_fdw.h 5.74 KB