summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBruce Momjian1999-09-04 19:55:50 +0000
committerBruce Momjian1999-09-04 19:55:50 +0000
commitfb7548f4dbc45a7b1b22627d48df262c0233379f (patch)
treede8131febea8fa1e65216d5c5e80ea0440afbe83
parentb4a607c9e0538a3047d156404cf48de7ea878b0b (diff)
Invalidate temp entries for aborted transactions.
-rw-r--r--src/backend/access/transam/xact.c4
-rw-r--r--src/backend/catalog/indexing.c9
-rw-r--r--src/backend/utils/cache/temprel.c80
-rw-r--r--src/include/utils/temprel.h5
4 files changed, 76 insertions, 22 deletions
diff --git a/src/backend/access/transam/xact.c b/src/backend/access/transam/xact.c
index be950ee3e53..79b640be070 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 85a22874354..f8a115582a5 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 015737d4b77..13c78c6934e 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 <sys/types.h>
#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 ecfa17985ea..248a6e134e0 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 */