diff options
author | Bruce Momjian <bruce@momjian.us> | 2006-04-25 00:25:22 +0000 |
---|---|---|
committer | Bruce Momjian <bruce@momjian.us> | 2006-04-25 00:25:22 +0000 |
commit | e6004f01518bb7c9c2c1fdf7e5fa4fa4a3e572f3 (patch) | |
tree | de46c5948ecbb3ef7e833d0c349ddb449ba94926 /src/backend/tcop/postgres.c | |
parent | f04080d73b64ea24f7c12ffda43ee605cb2e4a8c (diff) | |
download | postgresql-e6004f01518bb7c9c2c1fdf7e5fa4fa4a3e572f3.tar.gz postgresql-e6004f01518bb7c9c2c1fdf7e5fa4fa4a3e572f3.zip |
Add statement_timestamp(), clock_timestamp(), and
transaction_timestamp() (just like now()).
Also update statement_timeout() to mention it is statement arrival time
that is measured.
Catalog version updated.
Diffstat (limited to 'src/backend/tcop/postgres.c')
-rw-r--r-- | src/backend/tcop/postgres.c | 81 |
1 files changed, 59 insertions, 22 deletions
diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c index 04e432594e3..2135c92fd80 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.485 2006/04/22 01:26:00 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/tcop/postgres.c,v 1.486 2006/04/25 00:25:18 momjian Exp $ * * NOTES * this is the "main" module of the postgres backend and @@ -119,6 +119,12 @@ static volatile sig_atomic_t got_SIGHUP = false; static bool xact_started = false; /* + * Flag to keep track of whether we have done statement initialization. + * For extended query protocol this has to be remembered across messages. + */ +static bool command_initialized = false; + +/* * Flag to indicate that we are doing the outer loop's read-from-client, * as opposed to any random read from client that might happen within * commands like COPY FROM STDIN. @@ -164,6 +170,8 @@ static int ReadCommand(StringInfo inBuf); static bool log_after_parse(List *raw_parsetree_list, const char *query_string, char **prepare_string); static List *pg_rewrite_queries(List *querytree_list); +static void initialize_command(void); +static void finalize_command(void); static void start_xact_command(void); static void finish_xact_command(void); static bool IsTransactionExitStmt(Node *parsetree); @@ -858,7 +866,7 @@ exec_simple_query(const char *query_string) * one of those, else bad things will happen in xact.c. (Note that this * will normally change current memory context.) */ - start_xact_command(); + initialize_command(); /* * Zap any pre-existing unnamed statement. (While not strictly necessary, @@ -1067,7 +1075,7 @@ exec_simple_query(const char *query_string) /* * Close down transaction statement, if one is open. */ - finish_xact_command(); + finalize_command(); /* * If there were no parsetrees, return EmptyQueryResponse message. @@ -1170,7 +1178,7 @@ exec_parse_message(const char *query_string, /* string to execute */ * that this will normally change current memory context.) Nothing happens * if we are already in one. */ - start_xact_command(); + initialize_command(); /* * Switch to appropriate context for constructing parsetrees. @@ -1393,7 +1401,7 @@ exec_bind_message(StringInfo input_message) * this will normally change current memory context.) Nothing happens if * we are already in one. */ - start_xact_command(); + initialize_command(); /* Switch back to message context */ MemoryContextSwitchTo(MessageContext); @@ -1759,7 +1767,7 @@ exec_execute_message(const char *portal_name, long max_rows) * Ensure we are in a transaction command (this should normally be the * case already due to prior BIND). */ - start_xact_command(); + initialize_command(); /* * If we are in aborted transaction state, the only portals we can @@ -1883,7 +1891,7 @@ exec_describe_statement_message(const char *stmt_name) * Start up a transaction command. (Note that this will normally change * current memory context.) Nothing happens if we are already in one. */ - start_xact_command(); + initialize_command(); /* Switch back to message context */ MemoryContextSwitchTo(MessageContext); @@ -1961,7 +1969,7 @@ exec_describe_portal_message(const char *portal_name) * Start up a transaction command. (Note that this will normally change * current memory context.) Nothing happens if we are already in one. */ - start_xact_command(); + initialize_command(); /* Switch back to message context */ MemoryContextSwitchTo(MessageContext); @@ -2000,16 +2008,15 @@ exec_describe_portal_message(const char *portal_name) /* - * Convenience routines for starting/committing a single command. + * Start xact if necessary, and set statement_timestamp() and optionally + * statement_timeout. */ static void -start_xact_command(void) +initialize_command(void) { - if (!xact_started) + if (!command_initialized) { - ereport(DEBUG3, - (errmsg_internal("StartTransactionCommand"))); - StartTransactionCommand(); + SetCurrentStatementStartTimestamp(); /* Set statement timeout running, if any */ if (StatementTimeout > 0) @@ -2017,19 +2024,48 @@ start_xact_command(void) else cancel_from_timeout = false; - xact_started = true; + command_initialized = true; } + start_xact_command(); } static void -finish_xact_command(void) +finalize_command(void) { - if (xact_started) + if (command_initialized) { /* Cancel any active statement timeout before committing */ disable_sig_alarm(true); - /* Now commit the command */ + command_initialized = false; + } + finish_xact_command(); +} + + +/* + * Check if the newly-arrived query string needs to have an implicit + * transaction started. + */ +static void +start_xact_command(void) +{ + if (!xact_started) + { + ereport(DEBUG3, + (errmsg_internal("StartTransactionCommand"))); + + StartTransactionCommand(); + + xact_started = true; + } +} + +static void +finish_xact_command(void) +{ + if (xact_started) + { ereport(DEBUG3, (errmsg_internal("CommitTransactionCommand"))); @@ -3137,7 +3173,8 @@ PostgresMain(int argc, char *argv[], const char *username) /* We don't have a transaction command open anymore */ xact_started = false; - + command_initialized = false; + /* Now we can allow interrupts again */ RESUME_INTERRUPTS(); } @@ -3305,7 +3342,7 @@ PostgresMain(int argc, char *argv[], const char *username) pgstat_report_activity("<FASTPATH> function call"); /* start an xact for this function invocation */ - start_xact_command(); + initialize_command(); /* switch back to message context */ MemoryContextSwitchTo(MessageContext); @@ -3328,7 +3365,7 @@ PostgresMain(int argc, char *argv[], const char *username) } /* commit the function-invocation transaction */ - finish_xact_command(); + finalize_command(); send_ready_for_query = true; break; @@ -3416,7 +3453,7 @@ PostgresMain(int argc, char *argv[], const char *username) case 'S': /* sync */ pq_getmsgend(&input_message); - finish_xact_command(); + finalize_command(); send_ready_for_query = true; break; |