diff options
Diffstat (limited to 'src/backend')
-rw-r--r-- | src/backend/catalog/heap.c | 4 | ||||
-rw-r--r-- | src/backend/commands/creatinh.c | 35 | ||||
-rw-r--r-- | src/backend/tcop/utility.c | 27 |
3 files changed, 35 insertions, 31 deletions
diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c index 9ec241e3ea3..b2359e4725c 100644 --- a/src/backend/catalog/heap.c +++ b/src/backend/catalog/heap.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/catalog/heap.c,v 1.187 2002/03/19 02:18:14 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/catalog/heap.c,v 1.188 2002/03/19 02:58:19 momjian Exp $ * * * INTERFACE ROUTINES @@ -1057,7 +1057,7 @@ RelationTruncateIndexes(Oid heapId) */ void -heap_truncate(char *relname) +heap_truncate(const char *relname) { Relation rel; Oid rid; diff --git a/src/backend/commands/creatinh.c b/src/backend/commands/creatinh.c index ae2a90c9311..d6af805715c 100644 --- a/src/backend/commands/creatinh.c +++ b/src/backend/commands/creatinh.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/commands/Attic/creatinh.c,v 1.86 2002/03/19 02:18:15 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/commands/Attic/creatinh.c,v 1.87 2002/03/19 02:58:19 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -16,6 +16,7 @@ #include "postgres.h" #include "access/heapam.h" +#include "catalog/catalog.h" #include "catalog/catname.h" #include "catalog/indexing.h" #include "catalog/heap.h" @@ -221,7 +222,7 @@ DefineRelation(CreateStmt *stmt, char relkind) * themselves will be destroyed, too. */ void -RemoveRelation(char *name) +RemoveRelation(const char *name) { AssertArg(name); heap_drop_with_catalog(name, allowSystemTableMods); @@ -238,10 +239,34 @@ RemoveRelation(char *name) * Rows are removed, indices are truncated and reconstructed. */ void -TruncateRelation(char *name) +TruncateRelation(const char *relname) { - AssertArg(name); - heap_truncate(name); + Relation rel; + + AssertArg(relname); + + if (!allowSystemTableMods && IsSystemRelationName(relname)) + elog(ERROR, "TRUNCATE cannot be used on system tables. '%s' is a system table", + relname); + + if (!pg_ownercheck(GetUserId(), relname, RELNAME)) + elog(ERROR, "you do not own relation \"%s\"", relname); + + /* Grab exclusive lock in preparation for truncate */ + rel = heap_openr(relname, AccessExclusiveLock); + + if (rel->rd_rel->relkind == RELKIND_SEQUENCE) + elog(ERROR, "TRUNCATE cannot be used on sequences. '%s' is a sequence", + relname); + + if (rel->rd_rel->relkind == RELKIND_VIEW) + elog(ERROR, "TRUNCATE cannot be used on views. '%s' is a view", + relname); + + /* Keep the lock until transaction commit */ + heap_close(rel, NoLock); + + heap_truncate(relname); } diff --git a/src/backend/tcop/utility.c b/src/backend/tcop/utility.c index a6400eabc35..0c1ead0331c 100644 --- a/src/backend/tcop/utility.c +++ b/src/backend/tcop/utility.c @@ -10,7 +10,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/tcop/utility.c,v 1.133 2002/03/19 02:18:20 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/tcop/utility.c,v 1.134 2002/03/19 02:58:19 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -216,9 +216,7 @@ ProcessUtility(Node *parsetree, break; /* - * ******************************** relation and attribute - * manipulation ******************************** - * + * relation and attribute manipulation */ case T_CreateStmt: DefineRelation((CreateStmt *) parsetree, RELKIND_RELATION); @@ -301,26 +299,7 @@ ProcessUtility(Node *parsetree, case T_TruncateStmt: { - Relation rel; - - relname = ((TruncateStmt *) parsetree)->relName; - if (!allowSystemTableMods && IsSystemRelationName(relname)) - elog(ERROR, "TRUNCATE cannot be used on system tables. '%s' is a system table", - relname); - - /* Grab exclusive lock in preparation for truncate... */ - rel = heap_openr(relname, AccessExclusiveLock); - if (rel->rd_rel->relkind == RELKIND_SEQUENCE) - elog(ERROR, "TRUNCATE cannot be used on sequences. '%s' is a sequence", - relname); - if (rel->rd_rel->relkind == RELKIND_VIEW) - elog(ERROR, "TRUNCATE cannot be used on views. '%s' is a view", - relname); - heap_close(rel, NoLock); - - if (!pg_ownercheck(GetUserId(), relname, RELNAME)) - elog(ERROR, "you do not own class \"%s\"", relname); - TruncateRelation(relname); + TruncateRelation(((TruncateStmt *) parsetree)->relName); } break; |