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.
 
