Add a warning to AtEOXact_SPI() to catch cases where the current
authorJoe Conway <mail@joeconway.com>
Tue, 2 Dec 2003 19:26:47 +0000 (19:26 +0000)
committerJoe Conway <mail@joeconway.com>
Tue, 2 Dec 2003 19:26:47 +0000 (19:26 +0000)
transaction has been committed without SPI_finish() being called
first. Per recent discussion here:
http://archives.postgresql.org/pgsql-patches/2003-11/msg00286.php

src/backend/access/transam/xact.c
src/backend/executor/spi.c
src/include/executor/spi.h

index 7b29c5d411ee26c05c3db23ae20879f9849315a1..93375b2960ef2a92873d47252a7c700224c39cc3 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/access/transam/xact.c,v 1.157 2003/11/29 19:51:40 pgsql Exp $
+ *   $PostgreSQL: pgsql/src/backend/access/transam/xact.c,v 1.158 2003/12/02 19:26:47 joe Exp $
  *
  * NOTES
  *     Transaction aborts can now occur two ways:
@@ -977,7 +977,7 @@ CommitTransaction(void)
 
    CallEOXactCallbacks(true);
    AtEOXact_GUC(true);
-   AtEOXact_SPI();
+   AtEOXact_SPI(true);
    AtEOXact_gist();
    AtEOXact_hash();
    AtEOXact_nbtree();
@@ -1087,7 +1087,7 @@ AbortTransaction(void)
 
    CallEOXactCallbacks(false);
    AtEOXact_GUC(false);
-   AtEOXact_SPI();
+   AtEOXact_SPI(false);
    AtEOXact_gist();
    AtEOXact_hash();
    AtEOXact_nbtree();
index 3dee4246af38a031a3b1c2380f98a24116e10dba..5b4d92124d7a7f26229b3444a7192f1fb71c1134 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/executor/spi.c,v 1.108 2003/11/29 19:51:48 pgsql Exp $
+ *   $PostgreSQL: pgsql/src/backend/executor/spi.c,v 1.109 2003/12/02 19:26:47 joe Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -174,18 +174,26 @@ SPI_finish(void)
 }
 
 /*
- * Clean up SPI state at transaction commit or abort (we don't care which).
+ * Clean up SPI state at transaction commit or abort.
  */
 void
-AtEOXact_SPI(void)
+AtEOXact_SPI(bool isCommit)
 {
    /*
     * Note that memory contexts belonging to SPI stack entries will be
     * freed automatically, so we can ignore them here.  We just need to
     * restore our static variables to initial state.
     */
-   if (_SPI_stack != NULL)     /* there was abort */
+   if (_SPI_stack != NULL)
+   {
        free(_SPI_stack);
+       if (isCommit)
+           ereport(WARNING,
+                   (errcode(ERRCODE_WARNING),
+                    errmsg("freeing non-empty SPI stack"),
+                    errhint("Check for missing \"SPI_finish\" calls")));
+   }
+
    _SPI_current = _SPI_stack = NULL;
    _SPI_connected = _SPI_curid = -1;
    SPI_processed = 0;
index b0102c394bf9fddbb48d5502b0bb409c009cc354..a6a6f97c526df54d9dce411e205d8cfeaecb7158 100644 (file)
@@ -2,7 +2,7 @@
  *
  * spi.h
  *
- * $PostgreSQL: pgsql/src/include/executor/spi.h,v 1.40 2003/11/29 22:41:01 pgsql Exp $
+ * $PostgreSQL: pgsql/src/include/executor/spi.h,v 1.41 2003/12/02 19:26:47 joe Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -116,6 +116,6 @@ extern void SPI_cursor_fetch(Portal portal, bool forward, int count);
 extern void SPI_cursor_move(Portal portal, bool forward, int count);
 extern void SPI_cursor_close(Portal portal);
 
-extern void AtEOXact_SPI(void);
+extern void AtEOXact_SPI(bool isCommit);
 
 #endif   /* SPI_H */