• Peter Eisentraut's avatar
    Fix a crash in logical replication · dfa774ff
    Peter Eisentraut authored
    The bug was that determining which columns are part of the replica
    identity index using RelationGetIndexAttrBitmap() would run
    eval_const_expressions() on index expressions and predicates across
    all indexes of the table, which in turn might require a snapshot, but
    there wasn't one set, so it crashes.  There were actually two separate
    bugs, one on the publisher and one on the subscriber.
    
    To trigger the bug, a table that is part of a publication or
    subscription needs to have an index with a predicate or expression
    that lends itself to constant expressions simplification.
    
    The fix is to avoid the constant expressions simplification in
    RelationGetIndexAttrBitmap(), so that it becomes safe to call in these
    contexts.  The constant expressions simplification comes from the
    calls to RelationGetIndexExpressions()/RelationGetIndexPredicate() via
    BuildIndexInfo().  But RelationGetIndexAttrBitmap() calling
    BuildIndexInfo() is overkill.  The latter just takes pg_index catalog
    information, packs it into the IndexInfo structure, which former then
    just unpacks again and throws away.  We can just do this directly with
    less overhead and skip the troublesome calls to
    eval_const_expressions().  This also removes the awkward
    cross-dependency between relcache.c and index.c.
    
    Bug: #15114
    Reported-by: default avatarПетър Славов <pet.slavov@gmail.com>
    Reviewed-by: default avatarNoah Misch <noah@leadboat.com>
    Reviewed-by: default avatarMichael Paquier <michael@paquier.xyz>
    Discussion: https://www.postgresql.org/message-id/flat/152110589574.1223.17983600132321618383@wrigleys.postgresql.org/
    dfa774ff
100_bugs.pl 2.24 KB