mirror of
https://git.postgresql.org/git/postgresql.git
synced 2025-01-30 19:00:29 +08:00
Fix temp relation handling for indexes, cleanup
This commit is contained in:
parent
75e3ba335d
commit
f41f8eebe7
@ -8,7 +8,7 @@
|
||||
*
|
||||
*
|
||||
* 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
|
||||
* Transaction aborts can now occur two ways:
|
||||
@ -1119,7 +1119,7 @@ AbortTransaction()
|
||||
AtEOXact_portals();
|
||||
RecordTransactionAbort();
|
||||
RelationPurgeLocalRelation(false);
|
||||
invalidate_temp_relations();
|
||||
remove_temp_rel_in_myxid();
|
||||
AtEOXact_SPI();
|
||||
AtEOXact_nbtree();
|
||||
AtAbort_Cache();
|
||||
|
@ -8,7 +8,7 @@
|
||||
*
|
||||
*
|
||||
* 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
|
||||
@ -131,11 +131,11 @@ static FormData_pg_attribute a6 = {
|
||||
MaxCommandIdAttributeNumber, 0, -1, -1, '\001', 'p', '\0', 'i', '\0', '\0'
|
||||
};
|
||||
|
||||
/*
|
||||
/*
|
||||
We decide to call this attribute "tableoid" rather than say
|
||||
"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
|
||||
used in SQL.
|
||||
used in SQL.
|
||||
*/
|
||||
static FormData_pg_attribute a7 = {
|
||||
0xffffffff, {"tableoid"}, OIDOID, 0, sizeof(Oid),
|
||||
@ -1489,7 +1489,7 @@ heap_drop_with_catalog(const char *relname,
|
||||
RelationForgetRelation(rid);
|
||||
|
||||
if (istemp)
|
||||
remove_temp_relation(rid);
|
||||
remove_temp_rel_by_relid(rid);
|
||||
|
||||
if (has_toasttable)
|
||||
{
|
||||
|
@ -8,7 +8,7 @@
|
||||
*
|
||||
*
|
||||
* 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
|
||||
@ -1145,7 +1145,7 @@ index_drop(Oid indexId)
|
||||
RelationForgetRelation(indexId);
|
||||
|
||||
/* 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))
|
||||
elog(ERROR, "IndexesAreActive couldn't lock %u", relid);
|
||||
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);
|
||||
isactive = ((Form_pg_class) GETSTRUCT(&tuple))->relhasindex;
|
||||
ReleaseBuffer(buffer);
|
||||
|
29
src/backend/utils/cache/temprel.c
vendored
29
src/backend/utils/cache/temprel.c
vendored
@ -8,7 +8,7 @@
|
||||
*
|
||||
*
|
||||
* 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
|
||||
remove_all_temp_relations(void)
|
||||
{
|
||||
List *l,
|
||||
*next;
|
||||
|
||||
if (temp_rels == NIL)
|
||||
return;
|
||||
|
||||
AbortOutOfAnyTransaction();
|
||||
StartTransactionCommand();
|
||||
|
||||
l = temp_rels;
|
||||
while (l != NIL)
|
||||
while (temp_rels != 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)
|
||||
{
|
||||
char relname[NAMEDATALEN];
|
||||
|
||||
/* safe from deallocation */
|
||||
strcpy(relname, temp_rel->user_relname);
|
||||
heap_drop_with_catalog(relname, allowSystemTableMods);
|
||||
}
|
||||
|
||||
l = next;
|
||||
else
|
||||
index_drop(temp_rel->relid);
|
||||
CommandCounterIncrement();
|
||||
}
|
||||
temp_rels = NIL;
|
||||
CommitTransactionCommand();
|
||||
}
|
||||
|
||||
@ -129,7 +118,7 @@ remove_all_temp_relations(void)
|
||||
* we don't have the relname for indexes, so we just pass the oid
|
||||
*/
|
||||
void
|
||||
remove_temp_relation(Oid relid)
|
||||
remove_temp_rel_by_relid(Oid relid)
|
||||
{
|
||||
MemoryContext oldcxt;
|
||||
List *l,
|
||||
@ -179,7 +168,7 @@ remove_temp_relation(Oid relid)
|
||||
* We just have to delete the map entry.
|
||||
*/
|
||||
void
|
||||
invalidate_temp_relations(void)
|
||||
remove_temp_rel_in_myxid(void)
|
||||
{
|
||||
MemoryContext oldcxt;
|
||||
List *l,
|
||||
|
@ -7,7 +7,7 @@
|
||||
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc
|
||||
* 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,
|
||||
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,
|
||||
const char *newname);
|
||||
|
||||
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_physicalname(const char *relname);
|
||||
|
Loading…
Reference in New Issue
Block a user