mirror of
https://git.postgresql.org/git/postgresql.git
synced 2025-02-05 19:09:58 +08:00
Fix temp relation handling for indexes, cleanup
This commit is contained in:
parent
75e3ba335d
commit
f41f8eebe7
@ -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();
|
||||||
|
@ -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)
|
||||||
{
|
{
|
||||||
|
@ -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);
|
||||||
|
29
src/backend/utils/cache/temprel.c
vendored
29
src/backend/utils/cache/temprel.c
vendored
@ -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,
|
||||||
|
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user