From 5ce6829b73b28a3664268c8ba6dae3961c7ca23f Mon Sep 17 00:00:00 2001
From: Tom Lane <tgl@sss.pgh.pa.us>
Date: Wed, 20 Feb 2008 17:44:09 +0000
Subject: [PATCH] Put a CHECK_FOR_INTERRUPTS call into the loops that try to
 find a unique new OID or new relfilenode.  If the existing OIDs are
 sufficiently densely populated, this could take a long time (perhaps even be
 an infinite loop), so it seems wise to allow the system to respond to a
 cancel interrupt here. Per a gripe from Jacky Leng.

Backpatch as far as 8.1.  Older versions just fail on OID collision,
instead of looping.
---
 src/backend/catalog/catalog.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/src/backend/catalog/catalog.c b/src/backend/catalog/catalog.c
index bc94a5ca2a..872135affe 100644
--- a/src/backend/catalog/catalog.c
+++ b/src/backend/catalog/catalog.c
@@ -10,7 +10,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/catalog/catalog.c,v 1.72 2008/01/01 19:45:48 momjian Exp $
+ *	  $PostgreSQL: pgsql/src/backend/catalog/catalog.c,v 1.73 2008/02/20 17:44:09 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -374,6 +374,8 @@ GetNewOidWithIndex(Relation relation, Relation indexrel)
 	/* Generate new OIDs until we find one not in the table */
 	do
 	{
+		CHECK_FOR_INTERRUPTS();
+
 		newOid = GetNewObjectId();
 
 		ScanKeyInit(&key,
@@ -423,6 +425,8 @@ GetNewRelFileNode(Oid reltablespace, bool relisshared, Relation pg_class)
 
 	do
 	{
+		CHECK_FOR_INTERRUPTS();
+
 		/* Generate the OID */
 		if (pg_class)
 			rnode.relNode = GetNewOid(pg_class);