mirror of
https://github.com/postgres/postgres.git
synced 2025-04-24 10:47:04 +03:00
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
This commit is contained in:
parent
d8e70cd829
commit
a9819ca253
@ -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)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
void
|
void
|
||||||
heap_truncate(char *relname)
|
heap_truncate(const char *relname)
|
||||||
{
|
{
|
||||||
Relation rel;
|
Relation rel;
|
||||||
Oid rid;
|
Oid rid;
|
||||||
|
@ -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 @@
|
|||||||
#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)
|
|||||||
* 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)
|
|||||||
* 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 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* 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,
|
|||||||
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,
|
|||||||
|
|
||||||
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 @@
|
|||||||
* 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,
|
|||||||
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 @@
|
|||||||
* 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 @@
|
|||||||
#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 */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user