diff --git a/src/backend/utils/time/combocid.c b/src/backend/utils/time/combocid.c index 52b612b15a..a70c7542c9 100644 --- a/src/backend/utils/time/combocid.c +++ b/src/backend/utils/time/combocid.c @@ -41,6 +41,7 @@ #include "postgres.h" +#include "miscadmin.h" #include "access/htup_details.h" #include "access/xact.h" #include "utils/combocid.h" @@ -119,7 +120,14 @@ HeapTupleHeaderGetCmax(HeapTupleHeader tup) CommandId cid = HeapTupleHeaderGetRawCommandId(tup); Assert(!(tup->t_infomask & HEAP_MOVED)); - Assert(TransactionIdIsCurrentTransactionId(HeapTupleHeaderGetUpdateXid(tup))); + /* + * Because GetUpdateXid() performs memory allocations if xmax is a + * multixact we can't Assert() if we're inside a critical section. This + * weakens the check, but not using GetCmax() inside one would complicate + * things too much. + */ + Assert(CritSectionCount > 0 || + TransactionIdIsCurrentTransactionId(HeapTupleHeaderGetUpdateXid(tup))); if (tup->t_infomask & HEAP_COMBOCID) return GetRealCmax(cid);