diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c index 65083a7574..c613495ee2 100644 --- a/src/backend/tcop/postgres.c +++ b/src/backend/tcop/postgres.c @@ -3954,12 +3954,12 @@ PostgresMain(int argc, char *argv[], const char *dbname, const char *username) { - int firstchar; - StringInfoData input_message; sigjmp_buf local_sigjmp_buf; + + /* these must be volatile to ensure state is preserved across longjmp: */ volatile bool send_ready_for_query = true; - bool idle_in_transaction_timeout_enabled = false; - bool idle_session_timeout_enabled = false; + volatile bool idle_in_transaction_timeout_enabled = false; + volatile bool idle_session_timeout_enabled = false; /* Initialize startup process environment if necessary. */ if (!IsUnderPostmaster) @@ -4239,8 +4239,10 @@ PostgresMain(int argc, char *argv[], * query cancels from being misreported as timeouts in case we're * forgetting a timeout cancel. */ - disable_all_timeouts(false); - QueryCancelPending = false; /* second to avoid race condition */ + disable_all_timeouts(false); /* do first to avoid race condition */ + QueryCancelPending = false; + idle_in_transaction_timeout_enabled = false; + idle_session_timeout_enabled = false; /* Not reading from the client anymore. */ DoingCommandRead = false; @@ -4329,6 +4331,9 @@ PostgresMain(int argc, char *argv[], for (;;) { + int firstchar; + StringInfoData input_message; + /* * At top of loop, reset extended-query-message flag, so that any * errors encountered in "idle" state don't provoke skip.