From e2605c8311948e479b742ebbd81cdff400cb70c3 Mon Sep 17 00:00:00 2001 From: Joe Conway 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 7b29c5d411..93375b2960 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 3dee4246af..5b4d92124d 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 b0102c394b..a6a6f97c52 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 */