Fix temp relation handling for indexes, cleanup

This commit is contained in:
Bruce Momjian 2000-10-11 21:28:19 +00:00
parent 75e3ba335d
commit f41f8eebe7
5 changed files with 21 additions and 32 deletions

View File

@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/access/transam/xact.c,v 1.71 2000/09/27 10:41:55 petere Exp $ * $Header: /cvsroot/pgsql/src/backend/access/transam/xact.c,v 1.72 2000/10/11 21:28:17 momjian Exp $
* *
* NOTES * NOTES
* Transaction aborts can now occur two ways: * Transaction aborts can now occur two ways:
@ -1119,7 +1119,7 @@ AbortTransaction()
AtEOXact_portals(); AtEOXact_portals();
RecordTransactionAbort(); RecordTransactionAbort();
RelationPurgeLocalRelation(false); RelationPurgeLocalRelation(false);
invalidate_temp_relations(); remove_temp_rel_in_myxid();
AtEOXact_SPI(); AtEOXact_SPI();
AtEOXact_nbtree(); AtEOXact_nbtree();
AtAbort_Cache(); AtAbort_Cache();

View File

@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/catalog/heap.c,v 1.147 2000/10/05 19:48:21 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/catalog/heap.c,v 1.148 2000/10/11 21:28:18 momjian Exp $
* *
* *
* INTERFACE ROUTINES * INTERFACE ROUTINES
@ -131,11 +131,11 @@ static FormData_pg_attribute a6 = {
MaxCommandIdAttributeNumber, 0, -1, -1, '\001', 'p', '\0', 'i', '\0', '\0' MaxCommandIdAttributeNumber, 0, -1, -1, '\001', 'p', '\0', 'i', '\0', '\0'
}; };
/* /*
We decide to call this attribute "tableoid" rather than say We decide to call this attribute "tableoid" rather than say
"classoid" on the basis that in the future there may be more than one "classoid" on the basis that in the future there may be more than one
table of a particular class/type. In any case table is still the word table of a particular class/type. In any case table is still the word
used in SQL. used in SQL.
*/ */
static FormData_pg_attribute a7 = { static FormData_pg_attribute a7 = {
0xffffffff, {"tableoid"}, OIDOID, 0, sizeof(Oid), 0xffffffff, {"tableoid"}, OIDOID, 0, sizeof(Oid),
@ -1489,7 +1489,7 @@ heap_drop_with_catalog(const char *relname,
RelationForgetRelation(rid); RelationForgetRelation(rid);
if (istemp) if (istemp)
remove_temp_relation(rid); remove_temp_rel_by_relid(rid);
if (has_toasttable) if (has_toasttable)
{ {

View File

@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/catalog/index.c,v 1.127 2000/10/05 19:48:21 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/catalog/index.c,v 1.128 2000/10/11 21:28:18 momjian Exp $
* *
* *
* INTERFACE ROUTINES * INTERFACE ROUTINES
@ -1145,7 +1145,7 @@ index_drop(Oid indexId)
RelationForgetRelation(indexId); RelationForgetRelation(indexId);
/* does something only if it is a temp index */ /* does something only if it is a temp index */
remove_temp_relation(indexId); remove_temp_rel_by_relid(indexId);
} }
/* ---------------------------------------------------------------- /* ----------------------------------------------------------------
@ -1374,7 +1374,7 @@ IndexesAreActive(Oid relid, bool confirmCommitted)
if (!LockClassinfoForUpdate(relid, &tuple, &buffer, confirmCommitted)) if (!LockClassinfoForUpdate(relid, &tuple, &buffer, confirmCommitted))
elog(ERROR, "IndexesAreActive couldn't lock %u", relid); elog(ERROR, "IndexesAreActive couldn't lock %u", relid);
if (((Form_pg_class) GETSTRUCT(&tuple))->relkind != RELKIND_RELATION && if (((Form_pg_class) GETSTRUCT(&tuple))->relkind != RELKIND_RELATION &&
((Form_pg_class) GETSTRUCT(&tuple))->relkind != RELKIND_TOASTVALUE) ((Form_pg_class) GETSTRUCT(&tuple))->relkind != RELKIND_TOASTVALUE)
elog(ERROR, "relation %u isn't an indexable relation", relid); elog(ERROR, "relation %u isn't an indexable relation", relid);
isactive = ((Form_pg_class) GETSTRUCT(&tuple))->relhasindex; isactive = ((Form_pg_class) GETSTRUCT(&tuple))->relhasindex;
ReleaseBuffer(buffer); ReleaseBuffer(buffer);

View File

@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/utils/cache/Attic/temprel.c,v 1.27 2000/07/12 18:04:45 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/utils/cache/Attic/temprel.c,v 1.28 2000/10/11 21:28:19 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -91,35 +91,24 @@ create_temp_relation(const char *relname, HeapTuple pg_class_tuple)
void void
remove_all_temp_relations(void) remove_all_temp_relations(void)
{ {
List *l,
*next;
if (temp_rels == NIL)
return;
AbortOutOfAnyTransaction(); AbortOutOfAnyTransaction();
StartTransactionCommand(); StartTransactionCommand();
l = temp_rels; while (temp_rels != NIL)
while (l != NIL)
{ {
TempTable *temp_rel = (TempTable *) lfirst(l); char relname[NAMEDATALEN];
TempTable *temp_rel = (TempTable *) lfirst(temp_rels);
next = lnext(l); /* do this first, l is deallocated */
/* Indexes are dropped during heap drop */
if (temp_rel->relkind != RELKIND_INDEX) if (temp_rel->relkind != RELKIND_INDEX)
{ {
char relname[NAMEDATALEN];
/* safe from deallocation */ /* safe from deallocation */
strcpy(relname, temp_rel->user_relname); strcpy(relname, temp_rel->user_relname);
heap_drop_with_catalog(relname, allowSystemTableMods); heap_drop_with_catalog(relname, allowSystemTableMods);
} }
else
l = next; index_drop(temp_rel->relid);
CommandCounterIncrement();
} }
temp_rels = NIL;
CommitTransactionCommand(); CommitTransactionCommand();
} }
@ -129,7 +118,7 @@ remove_all_temp_relations(void)
* we don't have the relname for indexes, so we just pass the oid * we don't have the relname for indexes, so we just pass the oid
*/ */
void void
remove_temp_relation(Oid relid) remove_temp_rel_by_relid(Oid relid)
{ {
MemoryContext oldcxt; MemoryContext oldcxt;
List *l, List *l,
@ -179,7 +168,7 @@ remove_temp_relation(Oid relid)
* We just have to delete the map entry. * We just have to delete the map entry.
*/ */
void void
invalidate_temp_relations(void) remove_temp_rel_in_myxid(void)
{ {
MemoryContext oldcxt; MemoryContext oldcxt;
List *l, List *l,

View File

@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc * Portions Copyright (c) 1996-2000, PostgreSQL, Inc
* 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.10 2000/06/20 06:41:11 tgl Exp $ * $Id: temprel.h,v 1.11 2000/10/11 21:28:19 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -18,12 +18,12 @@
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_relation(Oid relid); extern void remove_temp_rel_by_relid(Oid relid);
extern bool rename_temp_relation(const char *oldname, extern bool rename_temp_relation(const char *oldname,
const char *newname); const char *newname);
extern void remove_all_temp_relations(void); extern void remove_all_temp_relations(void);
extern void invalidate_temp_relations(void); extern void remove_temp_rel_in_myxid(void);
extern char *get_temp_rel_by_username(const char *user_relname); extern char *get_temp_rel_by_username(const char *user_relname);
extern char *get_temp_rel_by_physicalname(const char *relname); extern char *get_temp_rel_by_physicalname(const char *relname);