diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgml index 69bdc0d4a1fe9cf449543ed7b0b67adfa2cf9972..52852ee6c2481417a442f8dbc0de30fa846b9b7c 100644 --- a/doc/src/sgml/config.sgml +++ b/doc/src/sgml/config.sgml @@ -1,5 +1,5 @@ Run-time Configuration @@ -3232,7 +3232,10 @@ SELECT * FROM parent WHERE key = 2400; Abort any statement that takes over the specified number of - milliseconds. A value of zero (the default) turns off the limitation. + milliseconds. If log_min_error_statement is set to + ERROR or lower, the statement that timed out will also be + logged. A value of zero (the default) turns off the + limitation. diff --git a/src/backend/storage/lmgr/proc.c b/src/backend/storage/lmgr/proc.c index efb09fb08f203f5bec95cadb5f23a2de503dc51c..3b264fa1796bf920b927ff85b050c0b9052a78c6 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 d1eb30c6ba0d5a592441c7f378e71b4871d43325..7967bef129266e60f32408532ff8e335e260a3aa 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 b9c9c5d5be63206911d7f70f58430de09dec35c4..7297f444bfd7ef2588da6eb1721627ab4ffd1a2f 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 f36d1a2428ce0338021d665e6aa6084871c2f11a..aa4d22e8b7e45937774dbc38bd62d9a5e50b4231 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';