提交 49ce6fff 编写于 作者: B Bruce Momjian

Allow removal of system-named pg_* temp tables. Rename temp file/dir as

pgsql_tmp.
上级 0bba6bdb
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/catalog/aclchk.c,v 1.50 2001/06/09 23:21:54 petere Exp $ * $Header: /cvsroot/pgsql/src/backend/catalog/aclchk.c,v 1.51 2001/06/18 16:13:21 momjian Exp $
* *
* NOTES * NOTES
* See acl.h. * See acl.h.
...@@ -32,6 +32,7 @@ ...@@ -32,6 +32,7 @@
#include "parser/parse_func.h" #include "parser/parse_func.h"
#include "utils/acl.h" #include "utils/acl.h"
#include "utils/syscache.h" #include "utils/syscache.h"
#include "utils/temprel.h"
static int32 aclcheck(Acl *acl, AclId id, AclIdType idtype, AclMode mode); static int32 aclcheck(Acl *acl, AclId id, AclIdType idtype, AclMode mode);
...@@ -437,7 +438,7 @@ pg_aclcheck(char *relname, Oid userid, AclMode mode) ...@@ -437,7 +438,7 @@ pg_aclcheck(char *relname, Oid userid, AclMode mode)
*/ */
if ((mode & (ACL_INSERT | ACL_UPDATE | ACL_DELETE)) && if ((mode & (ACL_INSERT | ACL_UPDATE | ACL_DELETE)) &&
!allowSystemTableMods && IsSystemRelationName(relname) && !allowSystemTableMods && IsSystemRelationName(relname) &&
strncmp(relname, "pg_temp.", strlen("pg_temp.")) != 0 && !is_temp_relname(relname) &&
!((Form_pg_shadow) GETSTRUCT(tuple))->usecatupd) !((Form_pg_shadow) GETSTRUCT(tuple))->usecatupd)
{ {
#ifdef ACLDEBUG #ifdef ACLDEBUG
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/catalog/heap.c,v 1.167 2001/06/12 05:55:49 tgl Exp $ * $Header: /cvsroot/pgsql/src/backend/catalog/heap.c,v 1.168 2001/06/18 16:13:21 momjian Exp $
* *
* *
* INTERFACE ROUTINES * INTERFACE ROUTINES
...@@ -281,8 +281,8 @@ heap_create(char *relname, ...@@ -281,8 +281,8 @@ heap_create(char *relname,
* replace relname of caller with a unique name for a temp * replace relname of caller with a unique name for a temp
* relation * relation
*/ */
snprintf(relname, NAMEDATALEN, "pg_temp.%d.%u", snprintf(relname, NAMEDATALEN, "%s_%d_%u",
(int) MyProcPid, uniqueId++); PG_TEMP_REL_PREFIX, (int) MyProcPid, uniqueId++);
} }
/* /*
...@@ -874,37 +874,6 @@ heap_create_with_catalog(char *relname, ...@@ -874,37 +874,6 @@ heap_create_with_catalog(char *relname,
} }
/* ----------------------------------------------------------------
* heap_drop_with_catalog - removes all record of named relation from catalogs
*
* 1) open relation, check for existence, etc.
* 2) remove inheritance information
* 3) remove indexes
* 4) remove pg_class tuple
* 5) remove pg_attribute tuples and related descriptions
* 6) remove pg_description tuples
* 7) remove pg_type tuples
* 8) RemoveConstraints ()
* 9) unlink relation
*
* old comments
* Except for vital relations, removes relation from
* relation catalog, and related attributes from
* attribute catalog (needed?). (Anything else?)
*
* get proper relation from relation catalog (if not arg)
* scan attribute catalog deleting attributes of reldesc
* (necessary?)
* delete relation from relation catalog
* (How are the tuples of the relation discarded?)
*
* XXX Must fix to work with indexes.
* There may be a better order for doing things.
* Problems with destroying a deleted database--cannot create
* a struct reldesc without having an open file descriptor.
* ----------------------------------------------------------------
*/
/* -------------------------------- /* --------------------------------
* RelationRemoveInheritance * RelationRemoveInheritance
* *
...@@ -1334,10 +1303,35 @@ DeleteTypeTuple(Relation rel) ...@@ -1334,10 +1303,35 @@ DeleteTypeTuple(Relation rel)
heap_close(pg_type_desc, RowExclusiveLock); heap_close(pg_type_desc, RowExclusiveLock);
} }
/* -------------------------------- /* ----------------------------------------------------------------
* heap_drop_with_catalog * heap_drop_with_catalog - removes all record of named relation from catalogs
* *
* -------------------------------- * 1) open relation, check for existence, etc.
* 2) remove inheritance information
* 3) remove indexes
* 4) remove pg_class tuple
* 5) remove pg_attribute tuples and related descriptions
* 6) remove pg_description tuples
* 7) remove pg_type tuples
* 8) RemoveConstraints ()
* 9) unlink relation
*
* old comments
* Except for vital relations, removes relation from
* relation catalog, and related attributes from
* attribute catalog (needed?). (Anything else?)
*
* get proper relation from relation catalog (if not arg)
* scan attribute catalog deleting attributes of reldesc
* (necessary?)
* delete relation from relation catalog
* (How are the tuples of the relation discarded?)
*
* XXX Must fix to work with indexes.
* There may be a better order for doing things.
* Problems with destroying a deleted database--cannot create
* a struct reldesc without having an open file descriptor.
* ----------------------------------------------------------------
*/ */
void void
heap_drop_with_catalog(const char *relname, heap_drop_with_catalog(const char *relname,
...@@ -1360,8 +1354,10 @@ heap_drop_with_catalog(const char *relname, ...@@ -1360,8 +1354,10 @@ heap_drop_with_catalog(const char *relname,
* prevent deletion of system relations * prevent deletion of system relations
*/ */
/* allow temp of pg_class? Guess so. */ /* allow temp of pg_class? Guess so. */
if (!istemp && !allow_system_table_mods && if (!istemp &&
IsSystemRelationName(RelationGetRelationName(rel))) !allow_system_table_mods &&
IsSystemRelationName(RelationGetRelationName(rel)) &&
!is_temp_relname(RelationGetRelationName(rel)))
elog(ERROR, "System relation \"%s\" may not be dropped", elog(ERROR, "System relation \"%s\" may not be dropped",
RelationGetRelationName(rel)); RelationGetRelationName(rel));
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/storage/file/fd.c,v 1.81 2001/06/11 04:12:29 tgl Exp $ * $Header: /cvsroot/pgsql/src/backend/storage/file/fd.c,v 1.82 2001/06/18 16:13:21 momjian Exp $
* *
* NOTES: * NOTES:
* *
...@@ -54,8 +54,8 @@ ...@@ -54,8 +54,8 @@
/* Filename components for OpenTemporaryFile */ /* Filename components for OpenTemporaryFile */
#define PG_TEMP_FILES_DIR "pg_tempfiles" #define PG_TEMP_FILES_DIR "pgsql_tmp"
#define PG_TEMP_FILE_PREFIX "pg_temp" #define PG_TEMP_FILE_PREFIX "pgsql_tmp"
/* /*
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/tcop/utility.c,v 1.113 2001/06/09 23:21:54 petere Exp $ * $Header: /cvsroot/pgsql/src/backend/tcop/utility.c,v 1.114 2001/06/18 16:13:21 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -46,6 +46,7 @@ ...@@ -46,6 +46,7 @@
#include "utils/acl.h" #include "utils/acl.h"
#include "utils/ps_status.h" #include "utils/ps_status.h"
#include "utils/syscache.h" #include "utils/syscache.h"
#include "utils/temprel.h"
#include "access/xlog.h" #include "access/xlog.h"
/* /*
...@@ -120,7 +121,8 @@ CheckDropPermissions(char *name, char rightkind) ...@@ -120,7 +121,8 @@ CheckDropPermissions(char *name, char rightkind)
elog(ERROR, "you do not own %s \"%s\"", elog(ERROR, "you do not own %s \"%s\"",
rentry->name, name); rentry->name, name);
if (!allowSystemTableMods && IsSystemRelationName(name)) if (!allowSystemTableMods && IsSystemRelationName(name) &&
!is_temp_relname(name))
elog(ERROR, "%s \"%s\" is a system %s", elog(ERROR, "%s \"%s\" is a system %s",
rentry->name, name, rentry->name); rentry->name, name, rentry->name);
......
...@@ -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: temprel.h,v 1.15 2001/03/22 04:01:14 momjian Exp $ * $Id: temprel.h,v 1.16 2001/06/18 16:13:21 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -16,6 +16,11 @@ ...@@ -16,6 +16,11 @@
#include "access/htup.h" #include "access/htup.h"
#define PG_TEMP_REL_PREFIX "pg_temp"
#define is_temp_relname(relname) \
(strncmp(relname, PG_TEMP_REL_PREFIX, strlen(PG_TEMP_REL_PREFIX)) == 0)
extern void create_temp_relation(const char *relname, extern void create_temp_relation(const char *relname,
HeapTuple pg_class_tuple); HeapTuple pg_class_tuple);
extern void remove_temp_rel_by_relid(Oid relid); extern void remove_temp_rel_by_relid(Oid relid);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册