diff --git a/src/backend/utils/cache/catcache.c b/src/backend/utils/cache/catcache.c index c467f11..7d63c97 100644 --- a/src/backend/utils/cache/catcache.c +++ b/src/backend/utils/cache/catcache.c @@ -1105,8 +1105,16 @@ SearchCatCache(CatCache *cache, SysScanDesc scandesc; HeapTuple ntp; - /* Make sure we're in a xact, even if this ends up being a cache hit */ - Assert(IsTransactionState()); + /* + * Make sure we're in a xact, even if this ends up being a cache hit + * + * This should really assert IsTransactionState() rather than merely + * IsTransactionOrTransactionBlock(), but it's currently possible for this + * function to be called from an aborted transaction. That's probably bad, + * but fixing that would require extensive reworking of our invalidation + * processing. + */ + Assert(IsTransactionOrTransactionBlock()); /* * one-time startup overhead for each cache diff --git a/src/test/regress/expected/transactions.out b/src/test/regress/expected/transactions.out index 5c84ec5..f0382de 100644 --- a/src/test/regress/expected/transactions.out +++ b/src/test/regress/expected/transactions.out @@ -599,6 +599,15 @@ fetch from foo; (1 row) abort; +create table pqr (a int); +begin; +create index on pqr (a); +savepoint q; +insert into pqr values (1); +select 1/0; +ERROR: division by zero +rollback; +drop table pqr; -- Test for successful cleanup of an aborted transaction at session exit. -- THIS MUST BE THE LAST TEST IN THIS FILE. begin; diff --git a/src/test/regress/sql/transactions.sql b/src/test/regress/sql/transactions.sql index faf6a9b..ed01b74 100644 --- a/src/test/regress/sql/transactions.sql +++ b/src/test/regress/sql/transactions.sql @@ -368,6 +368,15 @@ fetch from foo; abort; +create table pqr (a int); +begin; +create index on pqr (a); +savepoint q; +insert into pqr values (1); +select 1/0; +rollback; +drop table pqr; + -- Test for successful cleanup of an aborted transaction at session exit. -- THIS MUST BE THE LAST TEST IN THIS FILE.