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; diff --git a/src/include/catalog/heap.h b/src/include/catalog/heap.h index 368293148bb..4298f53bdc4 100644 --- a/src/include/catalog/heap.h +++ b/src/include/catalog/heap.h @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $Id: heap.h,v 1.44 2002/03/19 02:18:22 momjian Exp $ + * $Id: heap.h,v 1.45 2002/03/19 02:58:19 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -41,7 +41,7 @@ extern Oid heap_create_with_catalog(char *relname, TupleDesc tupdesc, extern void heap_drop_with_catalog(const char *relname, bool allow_system_table_mods); -extern void heap_truncate(char *relname); +extern void heap_truncate(const char *relname); extern void AddRelationRawConstraints(Relation rel, List *rawColDefaults, diff --git a/src/include/commands/creatinh.h b/src/include/commands/creatinh.h index e676fc25939..4cc9801e85e 100644 --- a/src/include/commands/creatinh.h +++ b/src/include/commands/creatinh.h @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $Id: creatinh.h,v 1.17 2001/11/05 17:46:33 momjian Exp $ + * $Id: creatinh.h,v 1.18 2002/03/19 02:58:20 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -17,7 +17,7 @@ #include "nodes/parsenodes.h" extern void DefineRelation(CreateStmt *stmt, char relkind); -extern void RemoveRelation(char *name); -extern void TruncateRelation(char *name); +extern void RemoveRelation(const char *name); +extern void TruncateRelation(const char *name); #endif /* CREATINH_H */