From 617d6ea7df6edbdf959a6c6dbf6f4fdd3d272a9c Mon Sep 17 00:00:00 2001
From: Tom Lane <tgl@sss.pgh.pa.us>
Date: Tue, 31 Aug 2004 17:10:36 +0000
Subject: [PATCH] Fix unintended assignment of sequences to the containing
 schema's default tablespace --- they should always go in the database's
 default tablespace.  Adjust heap_create() API so that it is passed the
 relkind to make this easier; should simplify any further tweaking of the same
 sort.

---
 src/backend/bootstrap/bootparse.y |  4 +--
 src/backend/catalog/heap.c        | 45 ++++++++++++++++++++++---------
 src/backend/catalog/index.c       |  4 +--
 src/include/catalog/heap.h        |  4 +--
 4 files changed, 38 insertions(+), 19 deletions(-)

diff --git a/src/backend/bootstrap/bootparse.y b/src/backend/bootstrap/bootparse.y
index c93e176f83..9bab19784a 100644
--- a/src/backend/bootstrap/bootparse.y
+++ b/src/backend/bootstrap/bootparse.y
@@ -9,7 +9,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/bootstrap/bootparse.y,v 1.72 2004/08/29 04:12:24 momjian Exp $
+ *	  $PostgreSQL: pgsql/src/backend/bootstrap/bootparse.y,v 1.73 2004/08/31 17:10:36 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -184,8 +184,8 @@ Boot_CreateStmt:
 												   PG_CATALOG_NAMESPACE,
 												   $3 ? GLOBALTABLESPACE_OID : 0,
 												   tupdesc,
+												   RELKIND_RELATION,
 												   $3,
-												   true,
 												   true);
 						elog(DEBUG4, "bootstrap relation created");
 					}
diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c
index 5cf6c5fa6d..f5ec158d7a 100644
--- a/src/backend/catalog/heap.c
+++ b/src/backend/catalog/heap.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/catalog/heap.c,v 1.275 2004/08/29 05:06:41 momjian Exp $
+ *	  $PostgreSQL: pgsql/src/backend/catalog/heap.c,v 1.276 2004/08/31 17:10:36 tgl Exp $
  *
  *
  * INTERFACE ROUTINES
@@ -201,12 +201,13 @@ heap_create(const char *relname,
 			Oid relnamespace,
 			Oid reltablespace,
 			TupleDesc tupDesc,
+			char relkind,
 			bool shared_relation,
-			bool create_storage,
 			bool allow_system_table_mods)
 {
 	Oid			relid;
 	bool		nailme = false;
+	bool		create_storage;
 	Relation	rel;
 
 	/*
@@ -263,6 +264,34 @@ heap_create(const char *relname,
 	else
 		relid = newoid();
 
+	/*
+	 * Decide if we need storage or not, and handle a couple other
+	 * special cases for particular relkinds.
+	 */
+	switch (relkind)
+	{
+		case RELKIND_VIEW:
+		case RELKIND_COMPOSITE_TYPE:
+			create_storage = false;
+			/*
+			 * Force reltablespace to zero if the relation has no physical
+			 * storage.  This is mainly just for cleanliness' sake.
+			 */
+			reltablespace = InvalidOid;
+			break;
+		case RELKIND_SEQUENCE:
+			create_storage = true;
+			/*
+			 * Force reltablespace to zero for sequences, since we don't
+			 * support moving them around into different tablespaces.
+			 */
+			reltablespace = InvalidOid;
+			break;
+		default:
+			create_storage = true;
+			break;
+	}
+
 	/*
 	 * Never allow a pg_class entry to explicitly specify the database's
 	 * default tablespace in reltablespace; force it to zero instead. This
@@ -275,13 +304,6 @@ heap_create(const char *relname,
 	if (reltablespace == MyDatabaseTableSpace)
 		reltablespace = InvalidOid;
 
-	/*
-	 * Also, force reltablespace to zero if the relation has no physical
-	 * storage.  This is mainly just for cleanliness' sake.
-	 */
-	if (!create_storage)
-		reltablespace = InvalidOid;
-
 	/*
 	 * build the relcache entry.
 	 */
@@ -728,16 +750,13 @@ heap_create_with_catalog(const char *relname,
 	 * Create the relcache entry (mostly dummy at this point) and the
 	 * physical disk file.	(If we fail further down, it's the smgr's
 	 * responsibility to remove the disk file again.)
-	 *
-	 * NB: create a physical file only if it's not a view or type relation.
 	 */
 	new_rel_desc = heap_create(relname,
 							   relnamespace,
 							   reltablespace,
 							   tupdesc,
+							   relkind,
 							   shared_relation,
-							   (relkind != RELKIND_VIEW &&
-								relkind != RELKIND_COMPOSITE_TYPE),
 							   allow_system_table_mods);
 
 	/* Fetch the relation OID assigned by heap_create */
diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c
index bed06fc538..cace4852d5 100644
--- a/src/backend/catalog/index.c
+++ b/src/backend/catalog/index.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/catalog/index.c,v 1.238 2004/08/29 05:06:41 momjian Exp $
+ *	  $PostgreSQL: pgsql/src/backend/catalog/index.c,v 1.239 2004/08/31 17:10:36 tgl Exp $
  *
  *
  * INTERFACE ROUTINES
@@ -543,8 +543,8 @@ index_create(Oid heapRelationId,
 								namespaceId,
 								tableSpaceId,
 								indexTupDesc,
+								RELKIND_INDEX,
 								shared_relation,
-								true,
 								allow_system_table_mods);
 
 	/* Fetch the relation OID assigned by heap_create */
diff --git a/src/include/catalog/heap.h b/src/include/catalog/heap.h
index 92adcb88e2..98c1eac5b0 100644
--- a/src/include/catalog/heap.h
+++ b/src/include/catalog/heap.h
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2004, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/heap.h,v 1.70 2004/08/29 04:13:04 momjian Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/heap.h,v 1.71 2004/08/31 17:10:36 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -39,8 +39,8 @@ extern Relation heap_create(const char *relname,
 			Oid relnamespace,
 			Oid reltablespace,
 			TupleDesc tupDesc,
+			char relkind,
 			bool shared_relation,
-			bool create_storage,
 			bool allow_system_table_mods);
 
 extern Oid heap_create_with_catalog(const char *relname,
-- 
2.24.1