diff --git a/src/backend/access/transam/xact.c b/src/backend/access/transam/xact.c index be950ee3e534ac56f705cb9120e30561d8169ba6..79b640be070a331f7aa54c177a19a12158fae749 100644 --- a/src/backend/access/transam/xact.c +++ b/src/backend/access/transam/xact.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/access/transam/xact.c,v 1.48 1999/09/04 18:42:15 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/access/transam/xact.c,v 1.49 1999/09/04 19:55:48 momjian Exp $ * * NOTES * Transaction aborts can now occur two ways: @@ -151,6 +151,7 @@ #include "commands/vacuum.h" #include "libpq/be-fsstubs.h" #include "storage/proc.h" +#include "utils/temprel.h" #include "utils/inval.h" #include "utils/portal.h" #include "utils/relcache.h" @@ -1022,6 +1023,7 @@ AbortTransaction() RecordTransactionAbort(); RelationPurgeLocalRelation(false); DestroyNoNameRels(); + invalidate_temp_relations(); AtEOXact_nbtree(); AtAbort_Cache(); AtAbort_Locks(); diff --git a/src/backend/catalog/indexing.c b/src/backend/catalog/indexing.c index 85a2287435490f2e25fb910ba0a003eee88aff88..f8a115582a5c1d760a3febf370b15e2b01f625d9 100644 --- a/src/backend/catalog/indexing.c +++ b/src/backend/catalog/indexing.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/catalog/indexing.c,v 1.42 1999/07/20 17:14:06 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/catalog/indexing.c,v 1.43 1999/09/04 19:55:49 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -449,13 +449,14 @@ ClassNameIndexScan(Relation heapRelation, char *relName) Relation idesc; ScanKeyData skey[1]; HeapTuple tuple; - + char *hold_rel; + /* * we have to do this before looking in system tables because temp * table namespace takes precedence */ - if ((tuple = get_temp_rel_by_name(relName)) != NULL) - return heap_copytuple(tuple); + if ((hold_rel = get_temp_rel_by_name(relName)) != NULL) + relName = hold_rel; ScanKeyEntryInitialize(&skey[0], (bits16) 0x0, diff --git a/src/backend/utils/cache/temprel.c b/src/backend/utils/cache/temprel.c index 015737d4b77acfba13943b469e2784a0bf1daaa3..13c78c6934e517011c8c21162b27715bf89acc62 100644 --- a/src/backend/utils/cache/temprel.c +++ b/src/backend/utils/cache/temprel.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/utils/cache/Attic/temprel.c,v 1.10 1999/07/17 20:18:02 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/cache/Attic/temprel.c,v 1.11 1999/09/04 19:55:50 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -18,13 +18,13 @@ * When a temp table is created, a linked list of temp table tuples is * stored here. When a relname cache lookup is done, references to user-named * temp tables are converted to the internal temp table names. - * */ #include #include "postgres.h" #include "access/heapam.h" +#include "access/xact.h" #include "catalog/heap.h" #include "catalog/index.h" #include "utils/temprel.h" @@ -41,7 +41,10 @@ static List *temp_rels = NIL; typedef struct TempTable { char *user_relname; - HeapTuple pg_class_tuple; + char *relname; + Oid relid; + char relkind; + TransactionId xid; } TempTable; @@ -55,11 +58,15 @@ create_temp_relation(char *relname, HeapTuple pg_class_tuple) temp_rel = palloc(sizeof(TempTable)); temp_rel->user_relname = palloc(NAMEDATALEN); + temp_rel->relname = palloc(NAMEDATALEN); /* save user-supplied name */ strcpy(temp_rel->user_relname, relname); - - temp_rel->pg_class_tuple = heap_copytuple(pg_class_tuple); + StrNCpy(temp_rel->relname, ((Form_pg_class) + GETSTRUCT(pg_class_tuple))->relname.data, NAMEDATALEN); + temp_rel->relid = pg_class_tuple->t_data->t_oid; + temp_rel->relkind = ((Form_pg_class) GETSTRUCT(pg_class_tuple))->relkind; + temp_rel->xid = GetCurrentTransactionId(); temp_rels = lcons(temp_rel, temp_rels); @@ -79,22 +86,19 @@ remove_all_temp_relations(void) while (l != NIL) { TempTable *temp_rel = lfirst(l); - Form_pg_class classtuple; - - classtuple = (Form_pg_class) GETSTRUCT(temp_rel->pg_class_tuple); next = lnext(l); /* do this first, l is deallocated */ - if (classtuple->relkind != RELKIND_INDEX) + if (temp_rel->relkind != RELKIND_INDEX) { - char relname[NAMEDATALEN]; + char relname[NAMEDATALEN]; /* safe from deallocation */ strcpy(relname, temp_rel->user_relname); heap_destroy_with_catalog(relname); } else - index_destroy(temp_rel->pg_class_tuple->t_data->t_oid); + index_destroy(temp_rel->relid); l = next; } @@ -118,10 +122,56 @@ remove_temp_relation(Oid relid) { TempTable *temp_rel = lfirst(l); - if (temp_rel->pg_class_tuple->t_data->t_oid == relid) + if (temp_rel->relid == relid) + { + pfree(temp_rel->user_relname); + pfree(temp_rel->relname); + pfree(temp_rel); + /* remove from linked list */ + if (prev != NIL) + { + lnext(prev) = lnext(l); + pfree(l); + l = lnext(prev); + } + else + { + temp_rels = lnext(l); + pfree(l); + l = temp_rels; + } + } + else + { + prev = l; + l = lnext(l); + } + + } + + MemoryContextSwitchTo(oldcxt); +} + +/* remove entries from aborted transactions */ +void +invalidate_temp_relations(void) +{ + MemoryContext oldcxt; + List *l, + *prev; + + oldcxt = MemoryContextSwitchTo((MemoryContext) CacheCxt); + + prev = NIL; + l = temp_rels; + while (l != NIL) + { + TempTable *temp_rel = lfirst(l); + + if (temp_rel->xid == GetCurrentTransactionId()) { pfree(temp_rel->user_relname); - pfree(temp_rel->pg_class_tuple); + pfree(temp_rel->relname); pfree(temp_rel); /* remove from linked list */ if (prev != NIL) @@ -148,7 +198,7 @@ remove_temp_relation(Oid relid) MemoryContextSwitchTo(oldcxt); } -HeapTuple +char * get_temp_rel_by_name(char *user_relname) { List *l; @@ -158,7 +208,7 @@ get_temp_rel_by_name(char *user_relname) TempTable *temp_rel = lfirst(l); if (strcmp(temp_rel->user_relname, user_relname) == 0) - return temp_rel->pg_class_tuple; + return temp_rel->relname; } return NULL; } diff --git a/src/include/utils/temprel.h b/src/include/utils/temprel.h index ecfa17985ea17d26508b4d1b58d84008d4f30238..248a6e134e0dbb5cd2e46f22378164541fac2278 100644 --- a/src/include/utils/temprel.h +++ b/src/include/utils/temprel.h @@ -6,7 +6,7 @@ * * Copyright (c) 1994, Regents of the University of California * - * $Id: temprel.h,v 1.4 1999/07/15 15:21:43 momjian Exp $ + * $Id: temprel.h,v 1.5 1999/09/04 19:55:50 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -17,7 +17,8 @@ void create_temp_relation(char *relname, HeapTuple pg_class_tuple); void remove_all_temp_relations(void); +void invalidate_temp_relations(void); void remove_temp_relation(Oid relid); -HeapTuple get_temp_rel_by_name(char *user_relname); +char *get_temp_rel_by_name(char *user_relname); #endif /* TEMPREL_H */