Commit e6004f01 authored by Bruce Momjian's avatar Bruce Momjian

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.
parent f04080d7
<!-- $PostgreSQL: pgsql/doc/src/sgml/config.sgml,v 1.55 2006/04/23 03:39:48 momjian Exp $ --> <!-- $PostgreSQL: pgsql/doc/src/sgml/config.sgml,v 1.56 2006/04/25 00:25:15 momjian Exp $ -->
<chapter Id="runtime-config"> <chapter Id="runtime-config">
<title>Server Configuration</title> <title>Server Configuration</title>
...@@ -3279,7 +3279,8 @@ SELECT * FROM parent WHERE key = 2400; ...@@ -3279,7 +3279,8 @@ SELECT * FROM parent WHERE key = 2400;
<listitem> <listitem>
<para> <para>
Abort any statement that takes over the specified number of Abort any statement that takes over the specified number of
milliseconds. If <varname>log_min_error_statement</> is set to milliseconds, starting from the time the command arrives at the server
from the client. If <varname>log_min_error_statement</> is set to
<literal>ERROR</> or lower, the statement that timed out will also be <literal>ERROR</> or lower, the statement that timed out will also be
logged. A value of zero (the default) turns off the logged. A value of zero (the default) turns off the
limitation. limitation.
......
<!-- $PostgreSQL: pgsql/doc/src/sgml/func.sgml,v 1.314 2006/04/23 03:39:50 momjian Exp $ --> <!-- $PostgreSQL: pgsql/doc/src/sgml/func.sgml,v 1.315 2006/04/25 00:25:15 momjian Exp $ -->
<chapter id="functions"> <chapter id="functions">
<title>Functions and Operators</title> <title>Functions and Operators</title>
...@@ -5302,6 +5302,15 @@ SELECT SUBSTRING('XY1234Z', 'Y*?([0-9]{1,3})'); ...@@ -5302,6 +5302,15 @@ SELECT SUBSTRING('XY1234Z', 'Y*?([0-9]{1,3})');
<indexterm> <indexterm>
<primary>now</primary> <primary>now</primary>
</indexterm> </indexterm>
<indexterm>
<primary>transaction_timestamp</primary>
</indexterm>
<indexterm>
<primary>statement_timestamp</primary>
</indexterm>
<indexterm>
<primary>clock_timestamp</primary>
</indexterm>
<indexterm> <indexterm>
<primary>timeofday</primary> <primary>timeofday</primary>
</indexterm> </indexterm>
...@@ -5358,7 +5367,7 @@ SELECT SUBSTRING('XY1234Z', 'Y*?([0-9]{1,3})'); ...@@ -5358,7 +5367,7 @@ SELECT SUBSTRING('XY1234Z', 'Y*?([0-9]{1,3})');
<row> <row>
<entry><literal><function>current_timestamp</function></literal></entry> <entry><literal><function>current_timestamp</function></literal></entry>
<entry><type>timestamp with time zone</type></entry> <entry><type>timestamp with time zone</type></entry>
<entry>Date and time; see <xref linkend="functions-datetime-current"> <entry>Date and time of start of current transaction; see <xref linkend="functions-datetime-current">
</entry> </entry>
<entry></entry> <entry></entry>
<entry></entry> <entry></entry>
...@@ -5474,8 +5483,36 @@ SELECT SUBSTRING('XY1234Z', 'Y*?([0-9]{1,3})'); ...@@ -5474,8 +5483,36 @@ SELECT SUBSTRING('XY1234Z', 'Y*?([0-9]{1,3})');
<row> <row>
<entry><literal><function>now</function>()</literal></entry> <entry><literal><function>now</function>()</literal></entry>
<entry><type>timestamp with time zone</type></entry> <entry><type>timestamp with time zone</type></entry>
<entry>Current date and time (equivalent to <entry>Date and time of start of current transaction (equivalent to
<function>current_timestamp</function>); see <xref linkend="functions-datetime-current"> <function>CURRENT_TIMESTAMP</function>); see <xref linkend="functions-datetime-current">
</entry>
<entry></entry>
<entry></entry>
</row>
<row>
<entry><literal><function>transaction_timestamp</function>()</literal></entry>
<entry><type>timestamp with time zone</type></entry>
<entry>Date and time of start of current transaction (equivalent to
<function>CURRENT_TIMESTAMP</function>); see <xref linkend="functions-datetime-current">
</entry>
<entry></entry>
<entry></entry>
</row>
<row>
<entry><literal><function>statement_timestamp</function>()</literal></entry>
<entry><type>timestamp with time zone</type></entry>
<entry>Date and time of start of current statement; see <xref linkend="functions-datetime-current">
</entry>
<entry></entry>
<entry></entry>
</row>
<row>
<entry><literal><function>clock_timestamp</function>()</literal></entry>
<entry><type>timestamp with time zone</type></entry>
<entry>Current date and time (changes during statement execution); see <xref linkend="functions-datetime-current">
</entry> </entry>
<entry></entry> <entry></entry>
<entry></entry> <entry></entry>
...@@ -5484,7 +5521,8 @@ SELECT SUBSTRING('XY1234Z', 'Y*?([0-9]{1,3})'); ...@@ -5484,7 +5521,8 @@ SELECT SUBSTRING('XY1234Z', 'Y*?([0-9]{1,3})');
<row> <row>
<entry><literal><function>timeofday</function>()</literal></entry> <entry><literal><function>timeofday</function>()</literal></entry>
<entry><type>text</type></entry> <entry><type>text</type></entry>
<entry>Current date and time; see <xref linkend="functions-datetime-current"> <entry>Current date and time (like <function>clock_timestamp</>), but as a Unix-style <type>text</> value;
see <xref linkend="functions-datetime-current">
</entry> </entry>
<entry></entry> <entry></entry>
<entry></entry> <entry></entry>
...@@ -6072,7 +6110,7 @@ SELECT TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40-05' AT TIME ZONE 'MST'; ...@@ -6072,7 +6110,7 @@ SELECT TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40-05' AT TIME ZONE 'MST';
</sect2> </sect2>
<sect2 id="functions-datetime-current"> <sect2 id="functions-datetime-current">
<title>Current Date/Time</title> <title>Date/Time of Transaction Start</title>
<indexterm> <indexterm>
<primary>date</primary> <primary>date</primary>
...@@ -6085,8 +6123,8 @@ SELECT TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40-05' AT TIME ZONE 'MST'; ...@@ -6085,8 +6123,8 @@ SELECT TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40-05' AT TIME ZONE 'MST';
</indexterm> </indexterm>
<para> <para>
The following functions are available to obtain the current date and/or The following functions are available to obtain the date and/or
time: time of the start of the current transaction:
<synopsis> <synopsis>
CURRENT_DATE CURRENT_DATE
CURRENT_TIME CURRENT_TIME
...@@ -6138,12 +6176,6 @@ SELECT LOCALTIMESTAMP; ...@@ -6138,12 +6176,6 @@ SELECT LOCALTIMESTAMP;
</screen> </screen>
</para> </para>
<para>
The function <function>now()</function> is the traditional
<productname>PostgreSQL</productname> equivalent to
<function>CURRENT_TIMESTAMP</function>.
</para>
<para> <para>
It is important to know that It is important to know that
<function>CURRENT_TIMESTAMP</function> and related functions return <function>CURRENT_TIMESTAMP</function> and related functions return
...@@ -6152,26 +6184,31 @@ SELECT LOCALTIMESTAMP; ...@@ -6152,26 +6184,31 @@ SELECT LOCALTIMESTAMP;
the intent is to allow a single transaction to have a consistent the intent is to allow a single transaction to have a consistent
notion of the <quote>current</quote> time, so that multiple notion of the <quote>current</quote> time, so that multiple
modifications within the same transaction bear the same modifications within the same transaction bear the same
time stamp. time stamp. Consider using <function>statement_timestamp</> or
<function>clock_timestamp</> if you need something that changes
more frequently.
</para> </para>
<note> <para>
<para> <function>CURRENT_TIMESTAMP</> might not be the
Other database systems may advance these values more transaction start time on other database systems.
frequently. For this reason, and for completeness,
</para> <function>transaction_timestamp</> is provided.
</note> The function <function>now()</function> is the traditional
<productname>PostgreSQL</productname> equivalent to
the SQL-standard <function>CURRENT_TIMESTAMP</function>.
</para>
<para> <para>
There is also the function <function>timeofday()</function> which <function>STATEMENT_TIMESTAMP</> is the time the statement
returns the wall-clock time and advances during transactions. For arrived at the server from the client. It is not the time
historical reasons <function>timeofday()</function> returns a the command started execution. If multiple commands were
<type>text</type> string rather than a <type>timestamp</type> sent as a single query string to the server, each command
value: has the same <function>STATEMENT_TIMESTAMP</> because they
<screen> all arrived at the same time. Also, commands executed
SELECT timeofday(); by server-side functions have a <function>STATEMENT_TIMESTAMP</>
<lineannotation>Result: </lineannotation><computeroutput>Sat Feb 17 19:07:32.000126 2001 EST</computeroutput> based on the time the client sent the query that triggered
</screen> the function, not the time the function was executed.
</para> </para>
<para> <para>
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/access/transam/xact.c,v 1.219 2006/03/29 21:17:37 tgl Exp $ * $PostgreSQL: pgsql/src/backend/access/transam/xact.c,v 1.220 2006/04/25 00:25:17 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -172,6 +172,7 @@ static CommandId currentCommandId; ...@@ -172,6 +172,7 @@ static CommandId currentCommandId;
* keep it inside the TransactionState stack. * keep it inside the TransactionState stack.
*/ */
static TimestampTz xactStartTimestamp; static TimestampTz xactStartTimestamp;
static TimestampTz stmtStartTimestamp;
/* /*
* GID to be used for preparing the current transaction. This is also * GID to be used for preparing the current transaction. This is also
...@@ -427,6 +428,24 @@ GetCurrentTransactionStartTimestamp(void) ...@@ -427,6 +428,24 @@ GetCurrentTransactionStartTimestamp(void)
return xactStartTimestamp; return xactStartTimestamp;
} }
/*
* GetCurrentStatementStartTimestamp
*/
TimestampTz
GetCurrentStatementStartTimestamp(void)
{
return stmtStartTimestamp;
}
/*
* SetCurrentStatementStartTimestamp
*/
void
SetCurrentStatementStartTimestamp(void)
{
stmtStartTimestamp = GetCurrentTimestamp();
}
/* /*
* GetCurrentTransactionNestLevel * GetCurrentTransactionNestLevel
* *
...@@ -1367,9 +1386,9 @@ StartTransaction(void) ...@@ -1367,9 +1386,9 @@ StartTransaction(void)
XactLockTableInsert(s->transactionId); XactLockTableInsert(s->transactionId);
/* /*
* set now() * now() and statement_timestamp() should be the same time
*/ */
xactStartTimestamp = GetCurrentTimestamp(); xactStartTimestamp = stmtStartTimestamp;
/* /*
* initialize current transaction state fields * initialize current transaction state fields
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * 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 * NOTES
* this is the "main" module of the postgres backend and * this is the "main" module of the postgres backend and
...@@ -118,6 +118,12 @@ static volatile sig_atomic_t got_SIGHUP = false; ...@@ -118,6 +118,12 @@ static volatile sig_atomic_t got_SIGHUP = false;
*/ */
static bool xact_started = 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, * 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 * as opposed to any random read from client that might happen within
...@@ -164,6 +170,8 @@ static int ReadCommand(StringInfo inBuf); ...@@ -164,6 +170,8 @@ static int ReadCommand(StringInfo inBuf);
static bool log_after_parse(List *raw_parsetree_list, static bool log_after_parse(List *raw_parsetree_list,
const char *query_string, char **prepare_string); const char *query_string, char **prepare_string);
static List *pg_rewrite_queries(List *querytree_list); 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 start_xact_command(void);
static void finish_xact_command(void); static void finish_xact_command(void);
static bool IsTransactionExitStmt(Node *parsetree); static bool IsTransactionExitStmt(Node *parsetree);
...@@ -858,7 +866,7 @@ exec_simple_query(const char *query_string) ...@@ -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 * one of those, else bad things will happen in xact.c. (Note that this
* will normally change current memory context.) * will normally change current memory context.)
*/ */
start_xact_command(); initialize_command();
/* /*
* Zap any pre-existing unnamed statement. (While not strictly necessary, * Zap any pre-existing unnamed statement. (While not strictly necessary,
...@@ -1067,7 +1075,7 @@ exec_simple_query(const char *query_string) ...@@ -1067,7 +1075,7 @@ exec_simple_query(const char *query_string)
/* /*
* Close down transaction statement, if one is open. * Close down transaction statement, if one is open.
*/ */
finish_xact_command(); finalize_command();
/* /*
* If there were no parsetrees, return EmptyQueryResponse message. * If there were no parsetrees, return EmptyQueryResponse message.
...@@ -1170,7 +1178,7 @@ exec_parse_message(const char *query_string, /* string to execute */ ...@@ -1170,7 +1178,7 @@ exec_parse_message(const char *query_string, /* string to execute */
* that this will normally change current memory context.) Nothing happens * that this will normally change current memory context.) Nothing happens
* if we are already in one. * if we are already in one.
*/ */
start_xact_command(); initialize_command();
/* /*
* Switch to appropriate context for constructing parsetrees. * Switch to appropriate context for constructing parsetrees.
...@@ -1393,7 +1401,7 @@ exec_bind_message(StringInfo input_message) ...@@ -1393,7 +1401,7 @@ exec_bind_message(StringInfo input_message)
* this will normally change current memory context.) Nothing happens if * this will normally change current memory context.) Nothing happens if
* we are already in one. * we are already in one.
*/ */
start_xact_command(); initialize_command();
/* Switch back to message context */ /* Switch back to message context */
MemoryContextSwitchTo(MessageContext); MemoryContextSwitchTo(MessageContext);
...@@ -1759,7 +1767,7 @@ exec_execute_message(const char *portal_name, long max_rows) ...@@ -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 * Ensure we are in a transaction command (this should normally be the
* case already due to prior BIND). * case already due to prior BIND).
*/ */
start_xact_command(); initialize_command();
/* /*
* If we are in aborted transaction state, the only portals we can * If we are in aborted transaction state, the only portals we can
...@@ -1883,7 +1891,7 @@ exec_describe_statement_message(const char *stmt_name) ...@@ -1883,7 +1891,7 @@ exec_describe_statement_message(const char *stmt_name)
* Start up a transaction command. (Note that this will normally change * Start up a transaction command. (Note that this will normally change
* current memory context.) Nothing happens if we are already in one. * current memory context.) Nothing happens if we are already in one.
*/ */
start_xact_command(); initialize_command();
/* Switch back to message context */ /* Switch back to message context */
MemoryContextSwitchTo(MessageContext); MemoryContextSwitchTo(MessageContext);
...@@ -1961,7 +1969,7 @@ exec_describe_portal_message(const char *portal_name) ...@@ -1961,7 +1969,7 @@ exec_describe_portal_message(const char *portal_name)
* Start up a transaction command. (Note that this will normally change * Start up a transaction command. (Note that this will normally change
* current memory context.) Nothing happens if we are already in one. * current memory context.) Nothing happens if we are already in one.
*/ */
start_xact_command(); initialize_command();
/* Switch back to message context */ /* Switch back to message context */
MemoryContextSwitchTo(MessageContext); MemoryContextSwitchTo(MessageContext);
...@@ -2000,16 +2008,15 @@ exec_describe_portal_message(const char *portal_name) ...@@ -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 static void
start_xact_command(void) initialize_command(void)
{ {
if (!xact_started) if (!command_initialized)
{ {
ereport(DEBUG3, SetCurrentStatementStartTimestamp();
(errmsg_internal("StartTransactionCommand")));
StartTransactionCommand();
/* Set statement timeout running, if any */ /* Set statement timeout running, if any */
if (StatementTimeout > 0) if (StatementTimeout > 0)
...@@ -2017,19 +2024,48 @@ start_xact_command(void) ...@@ -2017,19 +2024,48 @@ start_xact_command(void)
else else
cancel_from_timeout = false; cancel_from_timeout = false;
xact_started = true; command_initialized = true;
} }
start_xact_command();
} }
static void static void
finish_xact_command(void) finalize_command(void)
{ {
if (xact_started) if (command_initialized)
{ {
/* Cancel any active statement timeout before committing */ /* Cancel any active statement timeout before committing */
disable_sig_alarm(true); 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, ereport(DEBUG3,
(errmsg_internal("CommitTransactionCommand"))); (errmsg_internal("CommitTransactionCommand")));
...@@ -3137,7 +3173,8 @@ PostgresMain(int argc, char *argv[], const char *username) ...@@ -3137,7 +3173,8 @@ PostgresMain(int argc, char *argv[], const char *username)
/* We don't have a transaction command open anymore */ /* We don't have a transaction command open anymore */
xact_started = false; xact_started = false;
command_initialized = false;
/* Now we can allow interrupts again */ /* Now we can allow interrupts again */
RESUME_INTERRUPTS(); RESUME_INTERRUPTS();
} }
...@@ -3305,7 +3342,7 @@ PostgresMain(int argc, char *argv[], const char *username) ...@@ -3305,7 +3342,7 @@ PostgresMain(int argc, char *argv[], const char *username)
pgstat_report_activity("<FASTPATH> function call"); pgstat_report_activity("<FASTPATH> function call");
/* start an xact for this function invocation */ /* start an xact for this function invocation */
start_xact_command(); initialize_command();
/* switch back to message context */ /* switch back to message context */
MemoryContextSwitchTo(MessageContext); MemoryContextSwitchTo(MessageContext);
...@@ -3328,7 +3365,7 @@ PostgresMain(int argc, char *argv[], const char *username) ...@@ -3328,7 +3365,7 @@ PostgresMain(int argc, char *argv[], const char *username)
} }
/* commit the function-invocation transaction */ /* commit the function-invocation transaction */
finish_xact_command(); finalize_command();
send_ready_for_query = true; send_ready_for_query = true;
break; break;
...@@ -3416,7 +3453,7 @@ PostgresMain(int argc, char *argv[], const char *username) ...@@ -3416,7 +3453,7 @@ PostgresMain(int argc, char *argv[], const char *username)
case 'S': /* sync */ case 'S': /* sync */
pq_getmsgend(&input_message); pq_getmsgend(&input_message);
finish_xact_command(); finalize_command();
send_ready_for_query = true; send_ready_for_query = true;
break; break;
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/utils/adt/timestamp.c,v 1.162 2006/03/06 22:49:16 momjian Exp $ * $PostgreSQL: pgsql/src/backend/utils/adt/timestamp.c,v 1.163 2006/04/25 00:25:18 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -919,6 +919,18 @@ now(PG_FUNCTION_ARGS) ...@@ -919,6 +919,18 @@ now(PG_FUNCTION_ARGS)
PG_RETURN_TIMESTAMPTZ(GetCurrentTransactionStartTimestamp()); PG_RETURN_TIMESTAMPTZ(GetCurrentTransactionStartTimestamp());
} }
Datum
statement_timestamp(PG_FUNCTION_ARGS)
{
PG_RETURN_TIMESTAMPTZ(GetCurrentStatementStartTimestamp());
}
Datum
clock_timestamp(PG_FUNCTION_ARGS)
{
PG_RETURN_TIMESTAMPTZ(GetCurrentTimestamp());
}
Datum Datum
pgsql_postmaster_start_time(PG_FUNCTION_ARGS) pgsql_postmaster_start_time(PG_FUNCTION_ARGS)
{ {
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group * Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* $PostgreSQL: pgsql/src/include/access/xact.h,v 1.81 2006/03/24 04:32:13 tgl Exp $ * $PostgreSQL: pgsql/src/include/access/xact.h,v 1.82 2006/04/25 00:25:19 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -141,6 +141,8 @@ extern TransactionId GetCurrentTransactionIdIfAny(void); ...@@ -141,6 +141,8 @@ extern TransactionId GetCurrentTransactionIdIfAny(void);
extern SubTransactionId GetCurrentSubTransactionId(void); extern SubTransactionId GetCurrentSubTransactionId(void);
extern CommandId GetCurrentCommandId(void); extern CommandId GetCurrentCommandId(void);
extern TimestampTz GetCurrentTransactionStartTimestamp(void); extern TimestampTz GetCurrentTransactionStartTimestamp(void);
extern TimestampTz GetCurrentStatementStartTimestamp(void);
extern void SetCurrentStatementStartTimestamp(void);
extern int GetCurrentTransactionNestLevel(void); extern int GetCurrentTransactionNestLevel(void);
extern bool TransactionIdIsCurrentTransactionId(TransactionId xid); extern bool TransactionIdIsCurrentTransactionId(TransactionId xid);
extern void CommandCounterIncrement(void); extern void CommandCounterIncrement(void);
......
...@@ -37,7 +37,7 @@ ...@@ -37,7 +37,7 @@
* Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group * Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* $PostgreSQL: pgsql/src/include/catalog/catversion.h,v 1.323 2006/04/22 01:26:01 tgl Exp $ * $PostgreSQL: pgsql/src/include/catalog/catversion.h,v 1.324 2006/04/25 00:25:20 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -53,6 +53,6 @@ ...@@ -53,6 +53,6 @@
*/ */
/* yyyymmddN */ /* yyyymmddN */
#define CATALOG_VERSION_NO 200604211 #define CATALOG_VERSION_NO 200604241
#endif #endif
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group * Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* $PostgreSQL: pgsql/src/include/catalog/pg_proc.h,v 1.405 2006/04/05 22:11:55 tgl Exp $ * $PostgreSQL: pgsql/src/include/catalog/pg_proc.h,v 1.406 2006/04/25 00:25:20 momjian Exp $
* *
* NOTES * NOTES
* The script catalog/genbki.sh reads this file and generates .bki * The script catalog/genbki.sh reads this file and generates .bki
...@@ -1614,6 +1614,12 @@ DATA(insert OID = 1298 ( timetzdate_pl PGNSP PGUID 14 f f t f i 2 1184 "1266 ...@@ -1614,6 +1614,12 @@ DATA(insert OID = 1298 ( timetzdate_pl PGNSP PGUID 14 f f t f i 2 1184 "1266
DESCR("convert time with time zone and date to timestamp with time zone"); DESCR("convert time with time zone and date to timestamp with time zone");
DATA(insert OID = 1299 ( now PGNSP PGUID 12 f f t f s 0 1184 "" _null_ _null_ _null_ now - _null_ )); DATA(insert OID = 1299 ( now PGNSP PGUID 12 f f t f s 0 1184 "" _null_ _null_ _null_ now - _null_ ));
DESCR("current transaction time"); DESCR("current transaction time");
DATA(insert OID = 2647 ( transaction_timestamp PGNSP PGUID 12 f f t f s 0 1184 "" _null_ _null_ _null_ now - _null_ ));
DESCR("current transaction time");
DATA(insert OID = 2648 ( statement_timestamp PGNSP PGUID 12 f f t f s 0 1184 "" _null_ _null_ _null_ statement_timestamp - _null_ ));
DESCR("current statement time");
DATA(insert OID = 2649 ( clock_timestamp PGNSP PGUID 12 f f t f v 0 1184 "" _null_ _null_ _null_ clock_timestamp - _null_ ));
DESCR("current clock time");
/* OIDS 1300 - 1399 */ /* OIDS 1300 - 1399 */
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
* Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group * Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* $PostgreSQL: pgsql/src/include/utils/timestamp.h,v 1.59 2006/03/06 22:49:17 momjian Exp $ * $PostgreSQL: pgsql/src/include/utils/timestamp.h,v 1.60 2006/04/25 00:25:22 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -284,6 +284,8 @@ extern Datum timestamptz_trunc(PG_FUNCTION_ARGS); ...@@ -284,6 +284,8 @@ extern Datum timestamptz_trunc(PG_FUNCTION_ARGS);
extern Datum timestamptz_part(PG_FUNCTION_ARGS); extern Datum timestamptz_part(PG_FUNCTION_ARGS);
extern Datum now(PG_FUNCTION_ARGS); extern Datum now(PG_FUNCTION_ARGS);
extern Datum statement_timestamp(PG_FUNCTION_ARGS);
extern Datum clock_timestamp(PG_FUNCTION_ARGS);
extern Datum pgsql_postmaster_start_time(PG_FUNCTION_ARGS); extern Datum pgsql_postmaster_start_time(PG_FUNCTION_ARGS);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment