Rearrange order of pre-commit operations: must close cursors before doing
authorTom Lane <tgl@sss.pgh.pa.us>
Fri, 29 Oct 2004 22:19:53 +0000 (22:19 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Fri, 29 Oct 2004 22:19:53 +0000 (22:19 +0000)
ON COMMIT actions.  Per bug report from Michael Guerin.

src/backend/access/transam/xact.c

index 7a6fd3a132320552f6edf9c6dc25e2990f0651c2..583fb36a6f6d353965005c2a7c6ec21348b4ba2a 100644 (file)
@@ -10,7 +10,7 @@
  *
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/access/transam/xact.c,v 1.192 2004/10/16 18:57:22 tgl Exp $
+ *   $PostgreSQL: pgsql/src/backend/access/transam/xact.c,v 1.193 2004/10/29 22:19:53 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -1437,6 +1437,11 @@ CommitTransaction(void)
             TransStateAsString(s->state));
    Assert(s->parent == NULL);
 
+   /*
+    * Do pre-commit processing (most of this stuff requires database
+    * access, and in fact could still cause an error...)
+    */
+
    /*
     * Tell the trigger manager that this transaction is about to be
     * committed. He'll invoke all trigger deferred until XACT before we
@@ -1444,27 +1449,14 @@ CommitTransaction(void)
     */
    AfterTriggerEndXact();
 
-   /*
-    * Similarly, let ON COMMIT management do its thing before we start to
-    * commit.
-    */
-   PreCommit_on_commit_actions();
-
-   /* Prevent cancel/die interrupt while cleaning up */
-   HOLD_INTERRUPTS();
-
-   /*
-    * set the current transaction state information appropriately during
-    * the abort processing
-    */
-   s->state = TRANS_COMMIT;
+   /* Close open cursors */
+   AtCommit_Portals();
 
    /*
-    * Do pre-commit processing (most of this stuff requires database
-    * access, and in fact could still cause an error...)
+    * Let ON COMMIT management do its thing (must happen after closing
+    * cursors, to avoid dangling-reference problems)
     */
-
-   AtCommit_Portals();
+   PreCommit_on_commit_actions();
 
    /* close large objects before lower-level cleanup */
    AtEOXact_LargeObject(true);
@@ -1476,6 +1468,15 @@ CommitTransaction(void)
    /* This should be the last step before commit */
    AtEOXact_UpdatePasswordFile(true);
 
+   /* Prevent cancel/die interrupt while cleaning up */
+   HOLD_INTERRUPTS();
+
+   /*
+    * set the current transaction state information appropriately during
+    * the abort processing
+    */
+   s->state = TRANS_COMMIT;
+
    /*
     * Here is where we really truly commit.
     */