• Tom Lane's avatar
    Fix access to no-longer-open relcache entry in logical-rep worker. · b39630fd
    Tom Lane authored
    If we redirected a replicated tuple operation into a partition child
    table, and then tried to fire AFTER triggers for that event, the
    relation cache entry for the child table was already closed.  This has
    no visible ill effects as long as the entry is still there and still
    valid, but an unluckily-timed cache flush could result in a crash or
    other misbehavior.
    
    To fix, postpone the ExecCleanupTupleRouting call (which is what
    closes the child table) until after we've fired triggers.  This
    requires a bit of refactoring so that the cleanup function can
    have access to the necessary state.
    
    In HEAD, I took the opportunity to simplify some of worker.c's
    function APIs based on use of the new ApplyExecutionData struct.
    However, it doesn't seem safe/practical to back-patch that aspect,
    at least not without a lot of analysis of possible interactions
    with a04daa97.
    
    In passing, add an Assert to afterTriggerInvokeEvents to catch
    such cases.  This seems worthwhile because we've grown a number
    of fairly unstructured ways of calling AfterTriggerEndQuery.
    
    Back-patch to v13, where worker.c grew the ability to deal with
    partitioned target tables.
    
    Discussion: https://postgr.es/m/3382681.1621381328@sss.pgh.pa.us
    b39630fd
trigger.c 179 KB