Removal of temp tables - Mailing list pgsql-patches
From | Bruce Momjian |
---|---|
Subject | Removal of temp tables |
Date | |
Msg-id | 200106140417.f5E4HEn06854@candle.pha.pa.us Whole thread Raw |
Responses |
Re: Removal of temp tables
|
List | pgsql-patches |
Here is a patch that allows people to delete the pg_temp* tables used as temp tables. They are left around after a backend crash and the only way previously to remove them was to start postgres with the -O override option. I am wondering if pg_temp tables should even be seen as system tables by IsSystemRelationName(). We have to call them pg_ so user applications don't display them, but other than that they aren't like system tables. Comments? There are no tests to see if the table is actually in use. I can add them if people want it. --------------------------------------------------------------------------- test=> CREATE TEMP TABLE test (x int); CREATE test=> \dS List of relations Name | Type | Owner ----------------+---------+---------- ... pg_temp.6682.0 | table | postgres ... test=> DROP TABLE "pg_temp.6682.0"; DROP -- Bruce Momjian | http://candle.pha.pa.us pgman@candle.pha.pa.us | (610) 853-3000 + If your life is a hard drive, | 830 Blythe Avenue + Christ can be your backup. | Drexel Hill, Pennsylvania 19026 Index: src/backend/catalog/aclchk.c =================================================================== RCS file: /home/projects/pgsql/cvsroot/pgsql/src/backend/catalog/aclchk.c,v retrieving revision 1.50 diff -c -r1.50 aclchk.c *** src/backend/catalog/aclchk.c 2001/06/09 23:21:54 1.50 --- src/backend/catalog/aclchk.c 2001/06/14 04:06:32 *************** *** 32,37 **** --- 32,38 ---- #include "parser/parse_func.h" #include "utils/acl.h" #include "utils/syscache.h" + #include "utils/temprel.h" static int32 aclcheck(Acl *acl, AclId id, AclIdType idtype, AclMode mode); *************** *** 437,443 **** */ if ((mode & (ACL_INSERT | ACL_UPDATE | ACL_DELETE)) && !allowSystemTableMods && IsSystemRelationName(relname) && ! strncmp(relname, "pg_temp.", strlen("pg_temp.")) != 0 && !((Form_pg_shadow) GETSTRUCT(tuple))->usecatupd) { #ifdef ACLDEBUG --- 438,444 ---- */ if ((mode & (ACL_INSERT | ACL_UPDATE | ACL_DELETE)) && !allowSystemTableMods && IsSystemRelationName(relname) && ! !is_temp_relname(relname) && !((Form_pg_shadow) GETSTRUCT(tuple))->usecatupd) { #ifdef ACLDEBUG Index: src/backend/catalog/heap.c =================================================================== RCS file: /home/projects/pgsql/cvsroot/pgsql/src/backend/catalog/heap.c,v retrieving revision 1.167 diff -c -r1.167 heap.c *** src/backend/catalog/heap.c 2001/06/12 05:55:49 1.167 --- src/backend/catalog/heap.c 2001/06/14 04:06:38 *************** *** 281,288 **** * replace relname of caller with a unique name for a temp * relation */ ! snprintf(relname, NAMEDATALEN, "pg_temp.%d.%u", ! (int) MyProcPid, uniqueId++); } /* --- 281,288 ---- * replace relname of caller with a unique name for a temp * relation */ ! snprintf(relname, NAMEDATALEN, "%s.%d.%u", ! PG_TEMP_REL_PREFIX, (int) MyProcPid, uniqueId++); } /* *************** *** 874,910 **** } - /* ---------------------------------------------------------------- - * 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 * --- 874,879 ---- *************** *** 1334,1343 **** heap_close(pg_type_desc, RowExclusiveLock); } ! /* -------------------------------- ! * heap_drop_with_catalog * ! * -------------------------------- */ void heap_drop_with_catalog(const char *relname, --- 1303,1337 ---- heap_close(pg_type_desc, RowExclusiveLock); } ! /* ---------------------------------------------------------------- ! * 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 heap_drop_with_catalog(const char *relname, *************** *** 1360,1367 **** * prevent deletion of system relations */ /* allow temp of pg_class? Guess so. */ ! if (!istemp && !allow_system_table_mods && ! IsSystemRelationName(RelationGetRelationName(rel))) elog(ERROR, "System relation \"%s\" may not be dropped", RelationGetRelationName(rel)); --- 1354,1363 ---- * prevent deletion of system relations */ /* allow temp of pg_class? Guess so. */ ! if (!istemp && ! !allow_system_table_mods && ! IsSystemRelationName(RelationGetRelationName(rel)) && ! !is_temp_relname(RelationGetRelationName(rel))) elog(ERROR, "System relation \"%s\" may not be dropped", RelationGetRelationName(rel)); Index: src/backend/commands/vacuum.c =================================================================== RCS file: /home/projects/pgsql/cvsroot/pgsql/src/backend/commands/vacuum.c,v retrieving revision 1.196 diff -c -r1.196 vacuum.c *** src/backend/commands/vacuum.c 2001/06/13 21:44:40 1.196 --- src/backend/commands/vacuum.c 2001/06/14 04:06:40 *************** *** 491,497 **** vacuum_pages.num_pages = fraged_pages.num_pages = 0; scan_heap(vacrelstats, onerel, &vacuum_pages, &fraged_pages); if (IsIgnoringSystemIndexes() && ! IsSystemRelationName(RelationGetRelationName(onerel))) reindex = true; /* Now open indices */ --- 491,498 ---- vacuum_pages.num_pages = fraged_pages.num_pages = 0; scan_heap(vacrelstats, onerel, &vacuum_pages, &fraged_pages); if (IsIgnoringSystemIndexes() && ! IsSystemRelationName(RelationGetRelationName(onerel)) && ! !is_temp_relname(RelationGetRelationName(onerel))) reindex = true; /* Now open indices */ Index: src/backend/tcop/utility.c =================================================================== RCS file: /home/projects/pgsql/cvsroot/pgsql/src/backend/tcop/utility.c,v retrieving revision 1.113 diff -c -r1.113 utility.c *** src/backend/tcop/utility.c 2001/06/09 23:21:54 1.113 --- src/backend/tcop/utility.c 2001/06/14 04:06:44 *************** *** 46,51 **** --- 46,52 ---- #include "utils/acl.h" #include "utils/ps_status.h" #include "utils/syscache.h" + #include "utils/temprel.h" #include "access/xlog.h" /* *************** *** 120,126 **** elog(ERROR, "you do not own %s \"%s\"", rentry->name, name); ! if (!allowSystemTableMods && IsSystemRelationName(name)) elog(ERROR, "%s \"%s\" is a system %s", rentry->name, name, rentry->name); --- 121,128 ---- elog(ERROR, "you do not own %s \"%s\"", rentry->name, name); ! if (!allowSystemTableMods && IsSystemRelationName(name) && ! !is_temp_relname(name)) elog(ERROR, "%s \"%s\" is a system %s", rentry->name, name, rentry->name); Index: src/include/utils/temprel.h =================================================================== RCS file: /home/projects/pgsql/cvsroot/pgsql/src/include/utils/temprel.h,v retrieving revision 1.15 diff -c -r1.15 temprel.h *** src/include/utils/temprel.h 2001/03/22 04:01:14 1.15 --- src/include/utils/temprel.h 2001/06/14 04:06:47 *************** *** 16,21 **** --- 16,26 ---- #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))) + extern void create_temp_relation(const char *relname, HeapTuple pg_class_tuple); extern void remove_temp_rel_by_relid(Oid relid);
pgsql-patches by date: