• Tom Lane's avatar
    Centralize executor's opening/closing of Relations for rangetable entries. · 9ddef362
    Tom Lane authored
    Create an array estate->es_relations[] paralleling the es_range_table,
    and store references to Relations (relcache entries) there, so that any
    given RT entry is opened and closed just once per executor run.  Scan
    nodes typically still call ExecOpenScanRelation, but ExecCloseScanRelation
    is no more; relation closing is now done centrally in ExecEndPlan.
    
    This is slightly more complex than one would expect because of the
    interactions with relcache references held in ResultRelInfo nodes.
    The general convention is now that ResultRelInfo->ri_RelationDesc does
    not represent a separate relcache reference and so does not need to be
    explicitly closed; but there is an exception for ResultRelInfos in the
    es_trig_target_relations list, which are manufactured by
    ExecGetTriggerResultRel and have to be cleaned up by
    ExecCleanUpTriggerState.  (That much was true all along, but these
    ResultRelInfos are now more different from others than they used to be.)
    
    To allow the partition pruning logic to make use of es_relations[] rather
    than having its own relcache references, adjust PartitionedRelPruneInfo
    to store an RT index rather than a relation OID.
    
    Amit Langote, reviewed by David Rowley and Jesper Pedersen,
    some mods by me
    
    Discussion: https://postgr.es/m/468c85d9-540e-66a2-1dde-fec2b741e688@lab.ntt.co.jp
    9ddef362
postgres_fdw.c 171 KB