1
0
mirror of https://github.com/postgres/postgres.git synced 2025-04-22 23:02:54 +03:00

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
@ -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);