aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/backend/utils/cache/temprel.c17
1 files changed, 15 insertions, 2 deletions
diff --git a/src/backend/utils/cache/temprel.c b/src/backend/utils/cache/temprel.c
index af584591e57..460cf56a408 100644
--- a/src/backend/utils/cache/temprel.c
+++ b/src/backend/utils/cache/temprel.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/utils/cache/Attic/temprel.c,v 1.28 2000/10/11 21:28:19 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/utils/cache/Attic/temprel.c,v 1.29 2000/10/19 23:06:24 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -91,24 +91,37 @@ create_temp_relation(const char *relname, HeapTuple pg_class_tuple)
void
remove_all_temp_relations(void)
{
+ /* skip xact start overhead if nothing to do */
+ if (temp_rels == NIL)
+ return;
+
AbortOutOfAnyTransaction();
StartTransactionCommand();
+ /*
+ * The way this works is that each time through the loop, we delete
+ * the frontmost entry. The DROP will call remove_temp_rel_by_relid()
+ * as a side effect, thereby removing the entry in the temp_rels list.
+ * So this is not an infinite loop, even though it looks like one.
+ */
while (temp_rels != NIL)
{
- char relname[NAMEDATALEN];
TempTable *temp_rel = (TempTable *) lfirst(temp_rels);
if (temp_rel->relkind != RELKIND_INDEX)
{
+ char relname[NAMEDATALEN];
+
/* safe from deallocation */
strcpy(relname, temp_rel->user_relname);
heap_drop_with_catalog(relname, allowSystemTableMods);
}
else
index_drop(temp_rel->relid);
+ /* advance cmd counter to make catalog changes visible */
CommandCounterIncrement();
}
+
CommitTransactionCommand();
}