From e2605c8311948e479b742ebbd81cdff400cb70c3 Mon Sep 17 00:00:00 2001
From: Joe Conway <mail@joeconway.com>
Date: Tue, 2 Dec 2003 19:26:47 +0000
Subject: [PATCH] Add a warning to AtEOXact_SPI() to catch cases where the
 current 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 |  6 +++---
 src/backend/executor/spi.c        | 16 ++++++++++++----
 src/include/executor/spi.h        |  4 ++--
 3 files changed, 17 insertions(+), 9 deletions(-)

diff --git a/src/backend/access/transam/xact.c b/src/backend/access/transam/xact.c
index 7b29c5d411e..93375b2960e 100644
--- a/src/backend/access/transam/xact.c
+++ b/src/backend/access/transam/xact.c
@@ -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();
diff --git a/src/backend/executor/spi.c b/src/backend/executor/spi.c
index 3dee4246af3..5b4d92124d7 100644
--- a/src/backend/executor/spi.c
+++ b/src/backend/executor/spi.c
@@ -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;
diff --git a/src/include/executor/spi.h b/src/include/executor/spi.h
index b0102c394bf..a6a6f97c526 100644
--- a/src/include/executor/spi.h
+++ b/src/include/executor/spi.h
@@ -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 */
-- 
GitLab