提交 a9819ca2 编写于 作者: B Bruce Momjian

The attached patch cleans up the implementation of the TRUNCATE command;

in the current code, the authentication logic (check user, check the
relation we're operating on, etc) is done in tcop/utility.c, whereas the
actual TRUNCATE command in done in TruncateRelation() in
commands/createinh.c (which is really just a wrapper over
heap_truncate() in catalog/heap.c). This patch moves the authentication
logic into TruncateRelation(), as well as making some minor code
cleanups.

Neil Conway
上级 d8e70cd8
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * 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 * INTERFACE ROUTINES
...@@ -1057,7 +1057,7 @@ RelationTruncateIndexes(Oid heapId) ...@@ -1057,7 +1057,7 @@ RelationTruncateIndexes(Oid heapId)
*/ */
void void
heap_truncate(char *relname) heap_truncate(const char *relname)
{ {
Relation rel; Relation rel;
Oid rid; Oid rid;
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * 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 @@ ...@@ -16,6 +16,7 @@
#include "postgres.h" #include "postgres.h"
#include "access/heapam.h" #include "access/heapam.h"
#include "catalog/catalog.h"
#include "catalog/catname.h" #include "catalog/catname.h"
#include "catalog/indexing.h" #include "catalog/indexing.h"
#include "catalog/heap.h" #include "catalog/heap.h"
...@@ -221,7 +222,7 @@ DefineRelation(CreateStmt *stmt, char relkind) ...@@ -221,7 +222,7 @@ DefineRelation(CreateStmt *stmt, char relkind)
* themselves will be destroyed, too. * themselves will be destroyed, too.
*/ */
void void
RemoveRelation(char *name) RemoveRelation(const char *name)
{ {
AssertArg(name); AssertArg(name);
heap_drop_with_catalog(name, allowSystemTableMods); heap_drop_with_catalog(name, allowSystemTableMods);
...@@ -238,10 +239,34 @@ RemoveRelation(char *name) ...@@ -238,10 +239,34 @@ RemoveRelation(char *name)
* Rows are removed, indices are truncated and reconstructed. * Rows are removed, indices are truncated and reconstructed.
*/ */
void void
TruncateRelation(char *name) TruncateRelation(const char *relname)
{ {
AssertArg(name); Relation rel;
heap_truncate(name);
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);
} }
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
* *
* *
* IDENTIFICATION * 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, ...@@ -216,9 +216,7 @@ ProcessUtility(Node *parsetree,
break; break;
/* /*
* ******************************** relation and attribute * relation and attribute manipulation
* manipulation ********************************
*
*/ */
case T_CreateStmt: case T_CreateStmt:
DefineRelation((CreateStmt *) parsetree, RELKIND_RELATION); DefineRelation((CreateStmt *) parsetree, RELKIND_RELATION);
...@@ -301,26 +299,7 @@ ProcessUtility(Node *parsetree, ...@@ -301,26 +299,7 @@ ProcessUtility(Node *parsetree,
case T_TruncateStmt: case T_TruncateStmt:
{ {
Relation rel; TruncateRelation(((TruncateStmt *) parsetree)->relName);
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);
} }
break; break;
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group * Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California * 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, ...@@ -41,7 +41,7 @@ extern Oid heap_create_with_catalog(char *relname, TupleDesc tupdesc,
extern void heap_drop_with_catalog(const char *relname, extern void heap_drop_with_catalog(const char *relname,
bool allow_system_table_mods); bool allow_system_table_mods);
extern void heap_truncate(char *relname); extern void heap_truncate(const char *relname);
extern void AddRelationRawConstraints(Relation rel, extern void AddRelationRawConstraints(Relation rel,
List *rawColDefaults, List *rawColDefaults,
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group * Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California * 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 @@ ...@@ -17,7 +17,7 @@
#include "nodes/parsenodes.h" #include "nodes/parsenodes.h"
extern void DefineRelation(CreateStmt *stmt, char relkind); extern void DefineRelation(CreateStmt *stmt, char relkind);
extern void RemoveRelation(char *name); extern void RemoveRelation(const char *name);
extern void TruncateRelation(char *name); extern void TruncateRelation(const char *name);
#endif /* CREATINH_H */ #endif /* CREATINH_H */
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册