New memmgr logic in xact.c failed if AbortTransaction() is called when
authorTom Lane
Sun, 2 Jul 2000 02:28:38 +0000 (02:28 +0000)
committerTom Lane
Sun, 2 Jul 2000 02:28:38 +0000 (02:28 +0000)
there is no open transaction.

src/backend/access/transam/xact.c

index bc8f968571d54a7fd79446fad0d0a1916aafe541..74ffb134b41f59a0a008a5e0ccea435abb21f793 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/access/transam/xact.c,v 1.68 2000/06/28 03:31:05 tgl Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/access/transam/xact.c,v 1.69 2000/07/02 02:28:38 tgl Exp $
  *
  * NOTES
  *     Transaction aborts can now occur two ways:
@@ -749,6 +749,7 @@ AtCommit_Memory()
     *  Release all transaction-local memory.
     * ----------------
     */
+   Assert(TopTransactionContext != NULL);
    MemoryContextDelete(TopTransactionContext);
    TopTransactionContext = NULL;
    TransactionCommandContext = NULL;
@@ -825,17 +826,26 @@ AtAbort_Memory()
 {
    /* ----------------
     *  Make sure we are in a valid context (not a child of
-    *  TransactionCommandContext...)
+    *  TransactionCommandContext...).  Note that it is possible
+    *  for this code to be called when we aren't in a transaction
+    *  at all; go directly to TopMemoryContext in that case.
     * ----------------
     */
-   MemoryContextSwitchTo(TransactionCommandContext);
+   if (TransactionCommandContext != NULL)
+   {
+       MemoryContextSwitchTo(TransactionCommandContext);
 
-   /* ----------------
-    *  We do not want to destroy transaction contexts yet,
-    *  but it should be OK to delete any command-local memory.
-    * ----------------
-    */
-   MemoryContextResetAndDeleteChildren(TransactionCommandContext);
+       /* ----------------
+        *  We do not want to destroy transaction contexts yet,
+        *  but it should be OK to delete any command-local memory.
+        * ----------------
+        */
+       MemoryContextResetAndDeleteChildren(TransactionCommandContext);
+   }
+   else
+   {
+       MemoryContextSwitchTo(TopMemoryContext);
+   }
 }
 
 
@@ -863,7 +873,8 @@ AtCleanup_Memory()
     *  Release all transaction-local memory.
     * ----------------
     */
-   MemoryContextDelete(TopTransactionContext);
+   if (TopTransactionContext != NULL)
+       MemoryContextDelete(TopTransactionContext);
    TopTransactionContext = NULL;
    TransactionCommandContext = NULL;
 }