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