summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane2009-06-10 19:21:37 +0000
committerTom Lane2009-06-10 19:21:37 +0000
commit661b3e79c431e771f5d8e9ca647cbf90fbd6baa2 (patch)
treeec637cbfc8405a3009ec06423a4a6b514437e03b
parent61dd4185ffb034a22b4b40425d56fe37e7178488 (diff)
Add a warning about possible strange behavior of volatile functions
in cursors. This has always been the case, but given the lack of user complaints about it, I'm not going to bother back-patching this.
-rw-r--r--doc/src/sgml/ref/declare.sgml16
1 files changed, 15 insertions, 1 deletions
diff --git a/doc/src/sgml/ref/declare.sgml b/doc/src/sgml/ref/declare.sgml
index 641971149a..e93b4cf594 100644
--- a/doc/src/sgml/ref/declare.sgml
+++ b/doc/src/sgml/ref/declare.sgml
@@ -1,5 +1,5 @@
<!--
-$PostgreSQL: pgsql/doc/src/sgml/ref/declare.sgml,v 1.46 2009/04/10 17:56:21 tgl Exp $
+$PostgreSQL: pgsql/doc/src/sgml/ref/declare.sgml,v 1.47 2009/06/10 19:21:37 tgl Exp $
PostgreSQL documentation
-->
@@ -228,6 +228,20 @@ DECLARE <replaceable class="parameter">name</replaceable> [ BINARY ] [ INSENSITI
<literal>SCROLL</literal> may not be specified in this case.
</para>
+ <caution>
+ <para>
+ Scrollable and <literal>WITH HOLD</literal> cursors may give unexpected
+ results if they invoke any volatile functions (see <xref
+ linkend="xfunc-volatility">). When a previously fetched row is
+ re-fetched, the functions might be re-executed, perhaps leading to
+ results different from the first time. One workaround for such cases
+ is to declare the cursor <literal>WITH HOLD</literal> and commit the
+ transaction before reading any rows from it. This will force the
+ entire output of the cursor to be materialized in temporary storage,
+ so that volatile functions are executed exactly once for each row.
+ </para>
+ </caution>
+
<para>
If the cursor's query includes <literal>FOR UPDATE</> or <literal>FOR
SHARE</>, then returned rows are locked at the time they are first