Thread: pgsql: Fix a crash in logical replication
Fix a crash in logical replication 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: Петър Славов <pet.slavov@gmail.com> Reviewed-by: Noah Misch <noah@leadboat.com> Reviewed-by: Michael Paquier <michael@paquier.xyz> Discussion: https://www.postgresql.org/message-id/flat/152110589574.1223.17983600132321618383@wrigleys.postgresql.org/ Branch ------ master Details ------- https://git.postgresql.org/pg/commitdiff/dfa774ff9ac9de33d8cb98b91906ada55a2ab1df Modified Files -------------- src/backend/utils/cache/relcache.c | 50 ++++++++++++++++++++-------- src/test/subscription/t/100_bugs.pl | 65 +++++++++++++++++++++++++++++++++++++ 2 files changed, 101 insertions(+), 14 deletions(-)
On 2019-Jan-30, Peter Eisentraut wrote: > Fix a crash in logical replication > > 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. The intention is to backpatch this fix all the way back to 9.4, right? -- Álvaro Herrera https://www.2ndQuadrant.com/ PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
On 30/01/2019 10:54, Alvaro Herrera wrote: > On 2019-Jan-30, Peter Eisentraut wrote: > >> Fix a crash in logical replication >> >> 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. > > The intention is to backpatch this fix all the way back to 9.4, right? Yeah, the backpatching took a little longer than expected. -- Peter Eisentraut http://www.2ndQuadrant.com/ PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services