From 658657177e04b6b3af39ed9236146065afb422d8 Mon Sep 17 00:00:00 2001
From: Bruce Momjian <bruce@momjian.us>
Date: Mon, 19 Sep 2005 17:21:49 +0000
Subject: [PATCH] Print proper cause of statement cancel, user interaction or
 timeout.

---
 doc/src/sgml/config.sgml                     |  7 +++++--
 src/backend/storage/lmgr/proc.c              | 16 +++++++++++++---
 src/backend/tcop/postgres.c                  | 17 ++++++++++++-----
 src/include/storage/proc.h                   |  4 +++-
 src/test/regress/expected/prepared_xacts.out |  4 ++--
 5 files changed, 35 insertions(+), 13 deletions(-)

diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgml
index 69bdc0d4a1f..52852ee6c24 100644
--- a/doc/src/sgml/config.sgml
+++ b/doc/src/sgml/config.sgml
@@ -1,5 +1,5 @@
 <!--
-$PostgreSQL: pgsql/doc/src/sgml/config.sgml,v 1.17 2005/09/13 15:24:56 neilc Exp $
+$PostgreSQL: pgsql/doc/src/sgml/config.sgml,v 1.18 2005/09/19 17:21:46 momjian Exp $
 -->
 <chapter Id="runtime-config">
   <title>Run-time Configuration</title>
@@ -3232,7 +3232,10 @@ SELECT * FROM parent WHERE key = 2400;
       <listitem>
        <para>
         Abort any statement that takes over the specified number of
-        milliseconds.  A value of zero (the default) turns off the limitation.
+        milliseconds.  If <varname>log_min_error_statement</> is set to
+        <literal>ERROR</> or lower, the statement that timed out will also be
+        logged.  A value of zero (the default) turns off the 
+        limitation.
        </para>
       </listitem>
      </varlistentry>
diff --git a/src/backend/storage/lmgr/proc.c b/src/backend/storage/lmgr/proc.c
index efb09fb08f2..3b264fa1796 100644
--- a/src/backend/storage/lmgr/proc.c
+++ b/src/backend/storage/lmgr/proc.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/storage/lmgr/proc.c,v 1.163 2005/08/20 23:26:24 tgl Exp $
+ *	  $PostgreSQL: pgsql/src/backend/storage/lmgr/proc.c,v 1.164 2005/09/19 17:21:47 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -78,6 +78,7 @@ static bool waitingForLock = false;
 /* Mark these volatile because they can be changed by signal handler */
 static volatile bool statement_timeout_active = false;
 static volatile bool deadlock_timeout_active = false;
+volatile bool cancel_from_timeout = false;
 
 /* statement_fin_time is valid only if statement_timeout_active is true */
 static struct timeval statement_fin_time;
@@ -1058,6 +1059,7 @@ enable_sig_alarm(int delayms, bool is_statement_timeout)
 		Assert(!deadlock_timeout_active);
 		statement_fin_time = fin_time;
 		statement_timeout_active = true;
+		cancel_from_timeout = false;
 	}
 	else if (statement_timeout_active)
 	{
@@ -1128,14 +1130,18 @@ disable_sig_alarm(bool is_statement_timeout)
 		MemSet(&timeval, 0, sizeof(struct itimerval));
 		if (setitimer(ITIMER_REAL, &timeval, NULL))
 		{
-			statement_timeout_active = deadlock_timeout_active = false;
+			statement_timeout_active = false;
+			cancel_from_timeout = false;
+			deadlock_timeout_active = false;
 			return false;
 		}
 #else
 		/* BeOS doesn't have setitimer, but has set_alarm */
 		if (set_alarm(B_INFINITE_TIMEOUT, B_PERIODIC_ALARM) < 0)
 		{
-			statement_timeout_active = deadlock_timeout_active = false;
+			statement_timeout_active = false;
+			cancel_from_timeout = false;
+			deadlock_timeout_active = false;
 			return false;
 		}
 #endif
@@ -1146,7 +1152,10 @@ disable_sig_alarm(bool is_statement_timeout)
 
 	/* Cancel or reschedule statement timeout */
 	if (is_statement_timeout)
+	{
 		statement_timeout_active = false;
+		cancel_from_timeout = false;
+	}
 	else if (statement_timeout_active)
 	{
 		if (!CheckStatementTimeout())
@@ -1179,6 +1188,7 @@ CheckStatementTimeout(void)
 	{
 		/* Time to die */
 		statement_timeout_active = false;
+		cancel_from_timeout = true;
 		kill(MyProcPid, SIGINT);
 	}
 	else
diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c
index d1eb30c6ba0..7967bef1292 100644
--- a/src/backend/tcop/postgres.c
+++ b/src/backend/tcop/postgres.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/tcop/postgres.c,v 1.459 2005/09/16 19:31:04 momjian Exp $
+ *	  $PostgreSQL: pgsql/src/backend/tcop/postgres.c,v 1.460 2005/09/19 17:21:47 momjian Exp $
  *
  * NOTES
  *	  this is the "main" module of the postgres backend and
@@ -1979,7 +1979,9 @@ start_xact_command(void)
 		/* Set statement timeout running, if any */
 		if (StatementTimeout > 0)
 			enable_sig_alarm(StatementTimeout, true);
-
+		else
+			cancel_from_timeout = false;
+		
 		xact_started = true;
 	}
 }
@@ -2203,9 +2205,14 @@ ProcessInterrupts(void)
 		ImmediateInterruptOK = false;	/* not idle anymore */
 		DisableNotifyInterrupt();
 		DisableCatchupInterrupt();
-		ereport(ERROR,
-				(errcode(ERRCODE_QUERY_CANCELED),
-				 errmsg("canceling query due to user request or statement timeout")));
+		if (cancel_from_timeout)
+			ereport(ERROR,
+					(errcode(ERRCODE_QUERY_CANCELED),
+					 errmsg("canceling statement due to statement timeout")));
+		else
+			ereport(ERROR,
+					(errcode(ERRCODE_QUERY_CANCELED),
+					 errmsg("canceling statement due to user request")));
 	}
 	/* If we get here, do nothing (probably, QueryCancelPending was reset) */
 }
diff --git a/src/include/storage/proc.h b/src/include/storage/proc.h
index b9c9c5d5be6..7297f444bfd 100644
--- a/src/include/storage/proc.h
+++ b/src/include/storage/proc.h
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/storage/proc.h,v 1.81 2005/08/20 23:26:34 tgl Exp $
+ * $PostgreSQL: pgsql/src/include/storage/proc.h,v 1.82 2005/09/19 17:21:48 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -117,6 +117,8 @@ typedef struct PROC_HDR
 extern int	DeadlockTimeout;
 extern int	StatementTimeout;
 
+extern volatile bool cancel_from_timeout;
+
 
 /*
  * Function Prototypes
diff --git a/src/test/regress/expected/prepared_xacts.out b/src/test/regress/expected/prepared_xacts.out
index f36d1a2428c..aa4d22e8b7e 100644
--- a/src/test/regress/expected/prepared_xacts.out
+++ b/src/test/regress/expected/prepared_xacts.out
@@ -159,7 +159,7 @@ SELECT gid FROM pg_prepared_xacts;
 -- pxtest3 should be locked because of the pending DROP
 set statement_timeout to 1000;
 SELECT * FROM pxtest3;
-ERROR:  canceling query due to user request or statement timeout
+ERROR:  canceling statement due to statement timeout
 reset statement_timeout;
 -- Disconnect, we will continue testing in a different backend
 \c -
@@ -174,7 +174,7 @@ SELECT gid FROM pg_prepared_xacts;
 -- pxtest3 should still be locked because of the pending DROP
 set statement_timeout to 1000;
 SELECT * FROM pxtest3;
-ERROR:  canceling query due to user request or statement timeout
+ERROR:  canceling statement due to statement timeout
 reset statement_timeout;
 -- Commit table creation
 COMMIT PREPARED 'regress-one';
-- 
GitLab