From dc588058a033ee9a6f9f84f30cef13b2aafee0bc Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Wed, 2 Dec 2009 21:11:12 +0000 Subject: [PATCH] Clarify what's supposed to happen when a cursor FETCH is rolled back by aborting a subtransaction. Per discussion with Heikki. --- doc/src/sgml/ref/rollback_to.sgml | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/doc/src/sgml/ref/rollback_to.sgml b/doc/src/sgml/ref/rollback_to.sgml index c0d386b965..414f450a41 100644 --- a/doc/src/sgml/ref/rollback_to.sgml +++ b/doc/src/sgml/ref/rollback_to.sgml @@ -1,5 +1,5 @@ @@ -77,11 +77,14 @@ ROLLBACK [ WORK | TRANSACTION ] TO [ SAVEPOINT ] savepoint_nameFETCH command inside a savepoint that is later rolled - back, the cursor position remains at the position that FETCH - left it pointing to (that is, FETCH is not rolled back). + affected by a FETCH or MOVE command inside a + savepoint that is later rolled back, the cursor remains at the + position that FETCH left it pointing to (that is, the cursor + motion caused by FETCH is not rolled back). Closing a cursor is not undone by rolling back, either. + However, other side-effects caused by the cursor's query (such as + side-effects of volatile functions called by the query) are + rolled back if they occur during a savepoint that is later rolled back. A cursor whose execution causes a transaction to abort is put in a cannot-execute state, so while the transaction can be restored using ROLLBACK TO SAVEPOINT, the cursor can no longer be used.