From 16dc9bafb7811c900ffebc0ce5cdfeb8fad3266a Mon Sep 17 00:00:00 2001
From: Tom Lane <tgl@sss.pgh.pa.us>
Date: Wed, 30 Aug 2000 20:30:06 +0000
Subject: [PATCH] AbortOutOfAnyTransaction() just before backend exit, to
 ensure that resources are cleaned up if the user disconnected
 mid-transaction. Great thanks to Hiroshi for pointing out what should have
 been obvious...

---
 src/backend/tcop/postgres.c | 37 ++++++++++++++++++++-----------------
 1 file changed, 20 insertions(+), 17 deletions(-)

diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c
index b860967c3e3..3369e22825e 100644
--- a/src/backend/tcop/postgres.c
+++ b/src/backend/tcop/postgres.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/tcop/postgres.c,v 1.173 2000/08/29 09:36:47 petere Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/tcop/postgres.c,v 1.174 2000/08/30 20:30:06 tgl Exp $
  *
  * NOTES
  *	  this is the "main" module of the postgres backend and
@@ -1404,14 +1404,14 @@ PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[])
 	if (!IsUnderPostmaster)
 	{
 		puts("\nPOSTGRES backend interactive interface ");
-		puts("$Revision: 1.173 $ $Date: 2000/08/29 09:36:47 $\n");
+		puts("$Revision: 1.174 $ $Date: 2000/08/30 20:30:06 $\n");
 	}
 
 	/*
 	 * Initialize the deferred trigger manager
 	 */
 	if (DeferredTriggerInit() != 0)
-		proc_exit(0);
+		goto normalexit;
 
 	SetProcessingMode(NormalProcessing);
 
@@ -1451,10 +1451,8 @@ PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[])
 		AbortCurrentTransaction();
 
 		if (ExitAfterAbort)
-		{
-			ProcReleaseLocks(); /* Just to be sure... */
-			proc_exit(0);
-		}
+			goto errorexit;
+
 		/*
 		 * If we recovered successfully, return to normal top-level context
 		 * and clear ErrorContext for next time.
@@ -1547,8 +1545,7 @@ PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[])
 				if (HandleFunctionRequest() == EOF)
 				{
 					/* lost frontend connection during F message input */
-					pq_close();
-					proc_exit(0);
+					goto normalexit;
 				}
 				break;
 
@@ -1607,11 +1604,7 @@ PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[])
 				 */
 			case 'X':
 			case EOF:
-				if (!IsUnderPostmaster)
-					ShutdownXLOG();
-				pq_close();
-				proc_exit(0);
-				break;
+				goto normalexit;
 
 			default:
 				elog(ERROR, "unknown frontend message was received");
@@ -1649,10 +1642,20 @@ PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[])
 		 */
 		MemoryContextCheck(TopMemoryContext);	
 #endif
-	}							/* infinite for-loop */
+	}							/* end of main loop */
+
+normalexit:
+	ExitAfterAbort = true;		/* ensure we will exit if elog during abort */
+	AbortOutOfAnyTransaction();
+	if (!IsUnderPostmaster)
+		ShutdownXLOG();
+
+errorexit:
+	pq_close();
+	ProcReleaseLocks();			/* Just to be sure... */
+	proc_exit(0);
 
-	proc_exit(0);				/* shouldn't get here... */
-	return 1;
+	return 1;					/* keep compiler quiet */
 }
 
 #ifndef HAVE_GETRUSAGE
-- 
GitLab