Commit 760c770f authored by Robert Haas's avatar Robert Haas

Add convenience functions pg_sleep_for and pg_sleep_until.

Vik Fearing, reviewed by Pavel Stehule and myself
parent 043f6ff0
...@@ -7664,20 +7664,28 @@ SELECT TIMESTAMP 'now'; -- incorrect for use with DEFAULT ...@@ -7664,20 +7664,28 @@ SELECT TIMESTAMP 'now'; -- incorrect for use with DEFAULT
</indexterm> </indexterm>
<para> <para>
The following function is available to delay execution of the server The following functions are available to delay execution of the server
process: process:
<synopsis> <synopsis>
pg_sleep(<replaceable>seconds</replaceable>) pg_sleep(<replaceable>seconds</replaceable>)
pg_sleep_for(<type>interval</>)
pg_sleep_until(<type>timestamp with time zone</>)
</synopsis> </synopsis>
<function>pg_sleep</function> makes the current session's process <function>pg_sleep</function> makes the current session's process
sleep until <replaceable>seconds</replaceable> seconds have sleep until <replaceable>seconds</replaceable> seconds have
elapsed. <replaceable>seconds</replaceable> is a value of type elapsed. <replaceable>seconds</replaceable> is a value of type
<type>double precision</>, so fractional-second delays can be specified. <type>double precision</>, so fractional-second delays can be specified.
<function>pg_sleep_for</function> is a convenience function for larger
sleep times specified as an <type>interval</>.
<function>pg_sleep_until</function> is a convenience function for when
a specific wake-up time is desired.
For example: For example:
<programlisting> <programlisting>
SELECT pg_sleep(1.5); SELECT pg_sleep(1.5);
SELECT pg_sleep_for('5 minutes');
SELECT pg_sleep_until('tomorrow 03:00');
</programlisting> </programlisting>
</para> </para>
...@@ -7686,15 +7694,17 @@ SELECT pg_sleep(1.5); ...@@ -7686,15 +7694,17 @@ SELECT pg_sleep(1.5);
The effective resolution of the sleep interval is platform-specific; The effective resolution of the sleep interval is platform-specific;
0.01 seconds is a common value. The sleep delay will be at least as long 0.01 seconds is a common value. The sleep delay will be at least as long
as specified. It might be longer depending on factors such as server load. as specified. It might be longer depending on factors such as server load.
In particular, <function>pg_sleep_until</function> is not guaranteed to
wake up exactly at the specified time, but it will not wake up any earlier.
</para> </para>
</note> </note>
<warning> <warning>
<para> <para>
Make sure that your session does not hold more locks than necessary Make sure that your session does not hold more locks than necessary
when calling <function>pg_sleep</function>. Otherwise other sessions when calling <function>pg_sleep</function> or its variants. Otherwise
might have to wait for your sleeping process, slowing down the entire other sessions might have to wait for your sleeping process, slowing down
system. the entire system.
</para> </para>
</warning> </warning>
</sect2> </sect2>
......
...@@ -53,6 +53,6 @@ ...@@ -53,6 +53,6 @@
*/ */
/* yyyymmddN */ /* yyyymmddN */
#define CATALOG_VERSION_NO 201401291 #define CATALOG_VERSION_NO 201401301
#endif #endif
...@@ -3034,6 +3034,10 @@ DATA(insert OID = 2625 ( pg_ls_dir PGNSP PGUID 12 1 1000 0 0 f f f f t t v 1 0 ...@@ -3034,6 +3034,10 @@ DATA(insert OID = 2625 ( pg_ls_dir PGNSP PGUID 12 1 1000 0 0 f f f f t t v 1 0
DESCR("list all files in a directory"); DESCR("list all files in a directory");
DATA(insert OID = 2626 ( pg_sleep PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 2278 "701" _null_ _null_ _null_ _null_ pg_sleep _null_ _null_ _null_ )); DATA(insert OID = 2626 ( pg_sleep PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 2278 "701" _null_ _null_ _null_ _null_ pg_sleep _null_ _null_ _null_ ));
DESCR("sleep for the specified time in seconds"); DESCR("sleep for the specified time in seconds");
DATA(insert OID = 3935 ( pg_sleep_for PGNSP PGUID 14 1 0 0 0 f f f f t f v 1 0 2278 "1186" _null_ _null_ _null_ _null_ "select pg_catalog.pg_sleep(extract(epoch from pg_catalog.now() operator(pg_catalog.+) $1) operator(pg_catalog.-) extract(epoch from pg_catalog.now()))" _null_ _null_ _null_ ));
DESCR("sleep for the specified interval");
DATA(insert OID = 3936 ( pg_sleep_until PGNSP PGUID 14 1 0 0 0 f f f f t f v 1 0 2278 "1184" _null_ _null_ _null_ _null_ "select pg_catalog.pg_sleep(extract(epoch from $1) operator(pg_catalog.-) extract(epoch from pg_catalog.now()))" _null_ _null_ _null_ ));
DESCR("sleep until the specified time");
DATA(insert OID = 2971 ( text PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 25 "16" _null_ _null_ _null_ _null_ booltext _null_ _null_ _null_ )); DATA(insert OID = 2971 ( text PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 25 "16" _null_ _null_ _null_ _null_ booltext _null_ _null_ _null_ ));
DESCR("convert boolean to text"); DESCR("convert boolean to text");
......
...@@ -18,9 +18,9 @@ SET enable_indexscan TO on; ...@@ -18,9 +18,9 @@ SET enable_indexscan TO on;
SET enable_indexonlyscan TO off; SET enable_indexonlyscan TO off;
-- wait to let any prior tests finish dumping out stats; -- wait to let any prior tests finish dumping out stats;
-- else our messages might get lost due to contention -- else our messages might get lost due to contention
SELECT pg_sleep(2.0); SELECT pg_sleep_for('2 seconds');
pg_sleep pg_sleep_for
---------- --------------
(1 row) (1 row)
......
...@@ -16,7 +16,7 @@ SET enable_indexonlyscan TO off; ...@@ -16,7 +16,7 @@ SET enable_indexonlyscan TO off;
-- wait to let any prior tests finish dumping out stats; -- wait to let any prior tests finish dumping out stats;
-- else our messages might get lost due to contention -- else our messages might get lost due to contention
SELECT pg_sleep(2.0); SELECT pg_sleep_for('2 seconds');
-- save counters -- save counters
CREATE TEMP TABLE prevstats AS CREATE TEMP TABLE prevstats AS
......
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