• Tom Lane's avatar
    Postpone some stuff out of ExecInitModifyTable. · c5b7ba4e
    Tom Lane authored
    Arrange to do some things on-demand, rather than immediately during
    executor startup, because there's a fair chance of never having to do
    them at all:
    
    * Don't open result relations' indexes until needed.
    
    * Don't initialize partition tuple routing, nor the child-to-root
    tuple conversion map, until needed.
    
    This wins in UPDATEs on partitioned tables when only some of the
    partitions will actually receive updates; with larger partition
    counts the savings is quite noticeable.  Also, we can remove some
    sketchy heuristics in ExecInitModifyTable about whether to set up
    tuple routing.
    
    Also, remove execPartition.c's private hash table tracking which
    partitions were already opened by the ModifyTable node.  Instead
    use the hash added to ModifyTable itself by commit 86dc9005.
    
    To allow lazy computation of the conversion maps, we now set
    ri_RootResultRelInfo in all child ResultRelInfos.  We formerly set it
    only in some, not terribly well-defined, cases.  This has user-visible
    side effects in that now more error messages refer to the root
    relation instead of some partition (and provide error data in the
    root's column order, too).  It looks to me like this is a strict
    improvement in consistency, so I don't have a problem with the
    output changes visible in this commit.
    
    Extracted from a larger patch, which seemed to me to be too messy
    to push in one commit.
    
    Amit Langote, reviewed at different times by Heikki Linnakangas and
    myself
    
    Discussion: https://postgr.es/m/CA+HiwqG7ZruBmmih3wPsBZ4s0H2EhywrnXEduckY5Hr3fWzPWA@mail.gmail.com
    c5b7ba4e
privileges.out 80.4 KB