? GNUmakefile ? config.log ? config.status ? src/Makefile.global ? src/include/pg_config.h ? src/include/stamp-h Index: doc/src/sgml/ref/release.sgml =================================================================== RCS file: /projects/cvsroot/pgsql-server/doc/src/sgml/ref/release.sgml,v retrieving revision 1.1 diff -u -c -r1.1 release.sgml *** doc/src/sgml/ref/release.sgml 1 Aug 2004 17:32:13 -0000 1.1 --- doc/src/sgml/ref/release.sgml 11 Aug 2004 23:38:37 -0000 *************** *** 5,21 **** ! RELEASE SQL - Language Statements ! RELEASE destroy a previously defined savepoint ! RELEASE --- 5,21 ---- ! RELEASE SAVEPOINT SQL - Language Statements ! RELEASE SAVEPOINT destroy a previously defined savepoint ! RELEASE SAVEPOINT *************** *** 25,31 **** ! RELEASE savepoint_name --- 25,31 ---- ! RELEASE [ TO ] SAVEPOINT savepoint_name *************** *** 33,39 **** Description ! RELEASE destroys a savepoint previously defined in the current transaction. --- 33,39 ---- Description ! RELEASE SAVEPOINT destroys a savepoint previously defined in the current transaction. *************** *** 48,54 **** ! RELEASE also destroys all savepoints that were established after the named savepoint was established. --- 48,54 ---- ! RELEASE SAVEPOINT also destroys all savepoints that were established after the named savepoint was established. *************** *** 97,103 **** INSERT INTO table VALUES (3); SAVEPOINT my_savepoint; INSERT INTO table VALUES (4); ! RELEASE my_savepoint; COMMIT; The above transaction will insert both 3 and 4. --- 97,103 ---- INSERT INTO table VALUES (3); SAVEPOINT my_savepoint; INSERT INTO table VALUES (4); ! RELEASE SAVEPOINT my_savepoint; COMMIT; The above transaction will insert both 3 and 4. *************** *** 108,114 **** Compatibility ! RELEASE is fully conforming to the SQL standard. --- 108,117 ---- Compatibility ! The SQL2003 standard specifies only a RELEASE SAVEPOINT form. ! PostgreSQL and DB2 ! also allow RELEASE TO SAVEPOINT. Otherwise, this command is ! fully conforming. Index: doc/src/sgml/ref/rollback_to.sgml =================================================================== RCS file: /projects/cvsroot/pgsql-server/doc/src/sgml/ref/rollback_to.sgml,v retrieving revision 1.1 diff -u -c -r1.1 rollback_to.sgml *** doc/src/sgml/ref/rollback_to.sgml 1 Aug 2004 17:32:13 -0000 1.1 --- doc/src/sgml/ref/rollback_to.sgml 11 Aug 2004 23:38:37 -0000 *************** *** 5,21 **** ! ROLLBACK TO SQL - Language Statements ! ROLLBACK TO roll back to a savepoint ! ROLLBACK TO --- 5,21 ---- ! ROLLBACK TO SAVEPOINT SQL - Language Statements ! ROLLBACK TO SAVEPOINT roll back to a savepoint ! ROLLBACK TO SAVEPOINT *************** *** 25,31 **** ! ROLLBACK TO savepoint_name --- 25,31 ---- ! ROLLBACK [ WORK | TRANSACTION ] TO [ SAVEPOINT ] savepoint_name *************** *** 39,45 **** ! ROLLBACK TO implicitly destroys all savepoints that were established after the named savepoint. --- 39,45 ---- ! ROLLBACK TO SAVEPOINT implicitly destroys all savepoints that were established after the named savepoint. *************** *** 81,87 **** left it pointing to (that is, FETCH is not rolled back). A cursor whose execution causes a transaction to abort is put in a can't-execute state, so while the transaction can be restored using ! ROLLBACK TO, the cursor can no longer be used. --- 81,87 ---- left it pointing to (that is, FETCH is not rolled back). A cursor whose execution causes a transaction to abort is put in a can't-execute state, so while the transaction can be restored using ! ROLLBACK TO SAVEPOINT, the cursor can no longer be used. *************** *** 92,98 **** To undo the effects of the commands executed after my_savepoint was established: ! ROLLBACK TO my_savepoint; --- 92,98 ---- To undo the effects of the commands executed after my_savepoint was established: ! ROLLBACK TO SAVEPOINT my_savepoint; *************** *** 110,116 **** ---------- 1 ! ROLLBACK TO foo; FETCH 1 FROM foo; ?column? --- 110,116 ---- ---------- 1 ! ROLLBACK TO SAVEPOINT foo; FETCH 1 FROM foo; ?column? *************** *** 128,134 **** Compatibility ! This command is fully SQL standard conforming. --- 128,137 ---- Compatibility ! The SQL2003 standard specifies that the keyword SAVEPOINT is mandatory. ! PostgreSQL and Oracle ! allow the SAVEPOINT keyword to be omitted. Otherwise, this command is ! fully conforming. Index: src/backend/parser/gram.y =================================================================== RCS file: /projects/cvsroot/pgsql-server/src/backend/parser/gram.y,v retrieving revision 2.469 diff -u -c -r2.469 gram.y *** src/backend/parser/gram.y 2 Aug 2004 04:26:35 -0000 2.469 --- src/backend/parser/gram.y 11 Aug 2004 23:38:38 -0000 *************** *** 3982,4001 **** (Node *)makeString($2))); $$ = (Node *)n; } ! | RELEASE ColId { TransactionStmt *n = makeNode(TransactionStmt); n->kind = TRANS_STMT_RELEASE; n->options = list_make1(makeDefElem("savepoint_name", ! (Node *)makeString($2))); $$ = (Node *)n; } ! | ROLLBACK TO ColId { TransactionStmt *n = makeNode(TransactionStmt); n->kind = TRANS_STMT_ROLLBACK_TO; n->options = list_make1(makeDefElem("savepoint_name", ! (Node *)makeString($3))); $$ = (Node *)n; } ; --- 3982,4001 ---- (Node *)makeString($2))); $$ = (Node *)n; } ! | RELEASE opt_to SAVEPOINT ColId { TransactionStmt *n = makeNode(TransactionStmt); n->kind = TRANS_STMT_RELEASE; n->options = list_make1(makeDefElem("savepoint_name", ! (Node *)makeString($4))); $$ = (Node *)n; } ! | ROLLBACK opt_transaction TO opt_savepoint ColId { TransactionStmt *n = makeNode(TransactionStmt); n->kind = TRANS_STMT_ROLLBACK_TO; n->options = list_make1(makeDefElem("savepoint_name", ! (Node *)makeString($5))); $$ = (Node *)n; } ; *************** *** 4005,4010 **** --- 4005,4018 ---- | /*EMPTY*/ {} ; + opt_savepoint: SAVEPOINT {} + | /*EMPTY*/ {} + ; + + opt_to: TO {} + | /*EMPTY*/ {} + ; + transaction_mode_list: ISOLATION LEVEL iso_level { $$ = list_make1(makeDefElem("transaction_isolation", Index: src/backend/tcop/utility.c =================================================================== RCS file: /projects/cvsroot/pgsql-server/src/backend/tcop/utility.c,v retrieving revision 1.223 diff -u -c -r1.223 utility.c *** src/backend/tcop/utility.c 2 Aug 2004 01:30:45 -0000 1.223 --- src/backend/tcop/utility.c 11 Aug 2004 23:38:38 -0000 *************** *** 388,399 **** break; case TRANS_STMT_RELEASE: ! RequireTransactionChain((void *)stmt, "RELEASE"); ReleaseSavepoint(stmt->options); break; case TRANS_STMT_ROLLBACK_TO: ! RequireTransactionChain((void *)stmt, "ROLLBACK TO"); RollbackToSavepoint(stmt->options); /* * CommitTransactionCommand is in charge --- 388,399 ---- break; case TRANS_STMT_RELEASE: ! RequireTransactionChain((void *)stmt, "RELEASE SAVEPOINT"); ReleaseSavepoint(stmt->options); break; case TRANS_STMT_ROLLBACK_TO: ! RequireTransactionChain((void *)stmt, "ROLLBACK TO SAVEPOINT"); RollbackToSavepoint(stmt->options); /* * CommitTransactionCommand is in charge Index: src/test/regress/expected/transactions.out =================================================================== RCS file: /projects/cvsroot/pgsql-server/src/test/regress/expected/transactions.out,v retrieving revision 1.7 diff -u -c -r1.7 transactions.out *** src/test/regress/expected/transactions.out 27 Jul 2004 05:11:38 -0000 1.7 --- src/test/regress/expected/transactions.out 11 Aug 2004 23:38:38 -0000 *************** *** 77,87 **** SAVEPOINT one; DROP TABLE foo; CREATE TABLE bar (a int); ! ROLLBACK TO one; ! RELEASE one; SAVEPOINT two; CREATE TABLE baz (a int); ! RELEASE two; drop TABLE foobar; CREATE TABLE barbaz (a int); COMMIT; --- 77,87 ---- SAVEPOINT one; DROP TABLE foo; CREATE TABLE bar (a int); ! ROLLBACK TO SAVEPOINT one; ! RELEASE SAVEPOINT one; SAVEPOINT two; CREATE TABLE baz (a int); ! RELEASE SAVEPOINT two; drop TABLE foobar; CREATE TABLE barbaz (a int); COMMIT; *************** *** 109,125 **** SAVEPOINT one; INSERT into bar VALUES (1); ERROR: relation "bar" does not exist ! ROLLBACK TO one; ! RELEASE one; SAVEPOINT two; INSERT into barbaz VALUES (1); ! RELEASE two; SAVEPOINT three; SAVEPOINT four; INSERT INTO foo VALUES (2); ! RELEASE four; ! ROLLBACK TO three; ! RELEASE three; INSERT INTO foo VALUES (3); COMMIT; SELECT * FROM foo; -- should have 1 and 3 --- 109,125 ---- SAVEPOINT one; INSERT into bar VALUES (1); ERROR: relation "bar" does not exist ! ROLLBACK TO SAVEPOINT one; ! RELEASE SAVEPOINT one; SAVEPOINT two; INSERT into barbaz VALUES (1); ! RELEASE SAVEPOINT two; SAVEPOINT three; SAVEPOINT four; INSERT INTO foo VALUES (2); ! RELEASE SAVEPOINT four; ! ROLLBACK TO SAVEPOINT three; ! RELEASE SAVEPOINT three; INSERT INTO foo VALUES (3); COMMIT; SELECT * FROM foo; -- should have 1 and 3 *************** *** 140,147 **** SAVEPOINT one; SELECT foo; ERROR: column "foo" does not exist ! ROLLBACK TO one; ! RELEASE one; SAVEPOINT two; CREATE TABLE savepoints (a int); SAVEPOINT three; --- 140,147 ---- SAVEPOINT one; SELECT foo; ERROR: column "foo" does not exist ! ROLLBACK TO SAVEPOINT one; ! RELEASE SAVEPOINT one; SAVEPOINT two; CREATE TABLE savepoints (a int); SAVEPOINT three; *************** *** 150,156 **** INSERT INTO savepoints VALUES (2); SAVEPOINT five; INSERT INTO savepoints VALUES (3); ! ROLLBACK TO five; COMMIT; COMMIT; -- should not be in a transaction block WARNING: there is no transaction in progress --- 150,156 ---- INSERT INTO savepoints VALUES (2); SAVEPOINT five; INSERT INTO savepoints VALUES (3); ! ROLLBACK TO SAVEPOINT five; COMMIT; COMMIT; -- should not be in a transaction block WARNING: there is no transaction in progress *************** *** 165,171 **** BEGIN; SAVEPOINT one; DELETE FROM savepoints WHERE a=1; ! RELEASE one; SAVEPOINT two; DELETE FROM savepoints WHERE a=1; SAVEPOINT three; --- 165,171 ---- BEGIN; SAVEPOINT one; DELETE FROM savepoints WHERE a=1; ! RELEASE SAVEPOINT one; SAVEPOINT two; DELETE FROM savepoints WHERE a=1; SAVEPOINT three; *************** *** 200,206 **** INSERT INTO savepoints VALUES (6); SAVEPOINT one; INSERT INTO savepoints VALUES (7); ! RELEASE one; INSERT INTO savepoints VALUES (8); COMMIT; -- rows 6 and 8 should have been created by the same xact --- 200,206 ---- INSERT INTO savepoints VALUES (6); SAVEPOINT one; INSERT INTO savepoints VALUES (7); ! RELEASE SAVEPOINT one; INSERT INTO savepoints VALUES (8); COMMIT; -- rows 6 and 8 should have been created by the same xact *************** *** 221,227 **** INSERT INTO savepoints VALUES (9); SAVEPOINT one; INSERT INTO savepoints VALUES (10); ! ROLLBACK TO one; INSERT INTO savepoints VALUES (11); COMMIT; SELECT a FROM savepoints WHERE a in (9, 10, 11); --- 221,227 ---- INSERT INTO savepoints VALUES (9); SAVEPOINT one; INSERT INTO savepoints VALUES (10); ! ROLLBACK TO SAVEPOINT one; INSERT INTO savepoints VALUES (11); COMMIT; SELECT a FROM savepoints WHERE a in (9, 10, 11); *************** *** 244,250 **** INSERT INTO savepoints VALUES (13); SAVEPOINT two; INSERT INTO savepoints VALUES (14); ! ROLLBACK TO one; INSERT INTO savepoints VALUES (15); SAVEPOINT two; INSERT INTO savepoints VALUES (16); --- 244,250 ---- INSERT INTO savepoints VALUES (13); SAVEPOINT two; INSERT INTO savepoints VALUES (14); ! ROLLBACK TO SAVEPOINT one; INSERT INTO savepoints VALUES (15); SAVEPOINT two; INSERT INTO savepoints VALUES (16); *************** *** 266,274 **** INSERT INTO savepoints VALUES (19); SAVEPOINT two; INSERT INTO savepoints VALUES (20); ! ROLLBACK TO one; INSERT INTO savepoints VALUES (21); ! ROLLBACK TO one; INSERT INTO savepoints VALUES (22); COMMIT; SELECT a FROM savepoints WHERE a BETWEEN 18 AND 22; --- 266,274 ---- INSERT INTO savepoints VALUES (19); SAVEPOINT two; INSERT INTO savepoints VALUES (20); ! ROLLBACK TO SAVEPOINT one; INSERT INTO savepoints VALUES (21); ! ROLLBACK TO SAVEPOINT one; INSERT INTO savepoints VALUES (22); COMMIT; SELECT a FROM savepoints WHERE a BETWEEN 18 AND 22; *************** *** 282,291 **** -- only in a transaction block: SAVEPOINT one; ERROR: SAVEPOINT may only be used in transaction blocks ! ROLLBACK TO one; ! ERROR: ROLLBACK TO may only be used in transaction blocks ! RELEASE one; ! ERROR: RELEASE may only be used in transaction blocks -- Only "rollback to" allowed in aborted state BEGIN; SAVEPOINT one; --- 282,291 ---- -- only in a transaction block: SAVEPOINT one; ERROR: SAVEPOINT may only be used in transaction blocks ! ROLLBACK TO SAVEPOINT one; ! ERROR: ROLLBACK TO SAVEPOINT may only be used in transaction blocks ! RELEASE SAVEPOINT one; ! ERROR: RELEASE SAVEPOINT may only be used in transaction blocks -- Only "rollback to" allowed in aborted state BEGIN; SAVEPOINT one; *************** *** 293,301 **** ERROR: division by zero SAVEPOINT two; -- ignored till the end of ... ERROR: current transaction is aborted, commands ignored until end of transaction block ! RELEASE one; -- ignored till the end of ... ERROR: current transaction is aborted, commands ignored until end of transaction block ! ROLLBACK TO one; SELECT 1; ?column? ---------- --- 293,301 ---- ERROR: division by zero SAVEPOINT two; -- ignored till the end of ... ERROR: current transaction is aborted, commands ignored until end of transaction block ! RELEASE SAVEPOINT one; -- ignored till the end of ... ERROR: current transaction is aborted, commands ignored until end of transaction block ! ROLLBACK TO SAVEPOINT one; SELECT 1; ?column? ---------- *************** *** 328,334 **** 9 (10 rows) ! ROLLBACK TO one; FETCH 10 FROM c; unique2 --------- --- 328,334 ---- 9 (10 rows) ! ROLLBACK TO SAVEPOINT one; FETCH 10 FROM c; unique2 --------- *************** *** 344,350 **** 19 (10 rows) ! RELEASE one; FETCH 10 FROM c; unique2 --------- --- 344,350 ---- 19 (10 rows) ! RELEASE SAVEPOINT one; FETCH 10 FROM c; unique2 --------- *************** *** 365,376 **** SAVEPOINT two; FETCH 10 FROM c; ERROR: division by zero ! ROLLBACK TO two; -- c is now dead to the world ... FETCH 10 FROM c; ERROR: portal "c" cannot be run ! ROLLBACK TO two; ! RELEASE two; FETCH 10 FROM c; ERROR: portal "c" cannot be run COMMIT; --- 365,376 ---- SAVEPOINT two; FETCH 10 FROM c; ERROR: division by zero ! ROLLBACK TO SAVEPOINT two; -- c is now dead to the world ... FETCH 10 FROM c; ERROR: portal "c" cannot be run ! ROLLBACK TO SAVEPOINT two; ! RELEASE SAVEPOINT two; FETCH 10 FROM c; ERROR: portal "c" cannot be run COMMIT; Index: src/test/regress/sql/transactions.sql =================================================================== RCS file: /projects/cvsroot/pgsql-server/src/test/regress/sql/transactions.sql,v retrieving revision 1.7 diff -u -c -r1.7 transactions.sql *** src/test/regress/sql/transactions.sql 27 Jul 2004 05:11:48 -0000 1.7 --- src/test/regress/sql/transactions.sql 11 Aug 2004 23:38:38 -0000 *************** *** 64,74 **** SAVEPOINT one; DROP TABLE foo; CREATE TABLE bar (a int); ! ROLLBACK TO one; ! RELEASE one; SAVEPOINT two; CREATE TABLE baz (a int); ! RELEASE two; drop TABLE foobar; CREATE TABLE barbaz (a int); COMMIT; --- 64,74 ---- SAVEPOINT one; DROP TABLE foo; CREATE TABLE bar (a int); ! ROLLBACK TO SAVEPOINT one; ! RELEASE SAVEPOINT one; SAVEPOINT two; CREATE TABLE baz (a int); ! RELEASE SAVEPOINT two; drop TABLE foobar; CREATE TABLE barbaz (a int); COMMIT; *************** *** 83,99 **** INSERT INTO foo VALUES (1); SAVEPOINT one; INSERT into bar VALUES (1); ! ROLLBACK TO one; ! RELEASE one; SAVEPOINT two; INSERT into barbaz VALUES (1); ! RELEASE two; SAVEPOINT three; SAVEPOINT four; INSERT INTO foo VALUES (2); ! RELEASE four; ! ROLLBACK TO three; ! RELEASE three; INSERT INTO foo VALUES (3); COMMIT; SELECT * FROM foo; -- should have 1 and 3 --- 83,99 ---- INSERT INTO foo VALUES (1); SAVEPOINT one; INSERT into bar VALUES (1); ! ROLLBACK TO SAVEPOINT one; ! RELEASE SAVEPOINT one; SAVEPOINT two; INSERT into barbaz VALUES (1); ! RELEASE SAVEPOINT two; SAVEPOINT three; SAVEPOINT four; INSERT INTO foo VALUES (2); ! RELEASE SAVEPOINT four; ! ROLLBACK TO SAVEPOINT three; ! RELEASE SAVEPOINT three; INSERT INTO foo VALUES (3); COMMIT; SELECT * FROM foo; -- should have 1 and 3 *************** *** 103,110 **** BEGIN; SAVEPOINT one; SELECT foo; ! ROLLBACK TO one; ! RELEASE one; SAVEPOINT two; CREATE TABLE savepoints (a int); SAVEPOINT three; --- 103,110 ---- BEGIN; SAVEPOINT one; SELECT foo; ! ROLLBACK TO SAVEPOINT one; ! RELEASE SAVEPOINT one; SAVEPOINT two; CREATE TABLE savepoints (a int); SAVEPOINT three; *************** *** 113,119 **** INSERT INTO savepoints VALUES (2); SAVEPOINT five; INSERT INTO savepoints VALUES (3); ! ROLLBACK TO five; COMMIT; COMMIT; -- should not be in a transaction block SELECT * FROM savepoints; --- 113,119 ---- INSERT INTO savepoints VALUES (2); SAVEPOINT five; INSERT INTO savepoints VALUES (3); ! ROLLBACK TO SAVEPOINT five; COMMIT; COMMIT; -- should not be in a transaction block SELECT * FROM savepoints; *************** *** 122,128 **** BEGIN; SAVEPOINT one; DELETE FROM savepoints WHERE a=1; ! RELEASE one; SAVEPOINT two; DELETE FROM savepoints WHERE a=1; SAVEPOINT three; --- 122,128 ---- BEGIN; SAVEPOINT one; DELETE FROM savepoints WHERE a=1; ! RELEASE SAVEPOINT one; SAVEPOINT two; DELETE FROM savepoints WHERE a=1; SAVEPOINT three; *************** *** 145,151 **** INSERT INTO savepoints VALUES (6); SAVEPOINT one; INSERT INTO savepoints VALUES (7); ! RELEASE one; INSERT INTO savepoints VALUES (8); COMMIT; -- rows 6 and 8 should have been created by the same xact --- 145,151 ---- INSERT INTO savepoints VALUES (6); SAVEPOINT one; INSERT INTO savepoints VALUES (7); ! RELEASE SAVEPOINT one; INSERT INTO savepoints VALUES (8); COMMIT; -- rows 6 and 8 should have been created by the same xact *************** *** 157,163 **** INSERT INTO savepoints VALUES (9); SAVEPOINT one; INSERT INTO savepoints VALUES (10); ! ROLLBACK TO one; INSERT INTO savepoints VALUES (11); COMMIT; SELECT a FROM savepoints WHERE a in (9, 10, 11); --- 157,163 ---- INSERT INTO savepoints VALUES (9); SAVEPOINT one; INSERT INTO savepoints VALUES (10); ! ROLLBACK TO SAVEPOINT one; INSERT INTO savepoints VALUES (11); COMMIT; SELECT a FROM savepoints WHERE a in (9, 10, 11); *************** *** 170,176 **** INSERT INTO savepoints VALUES (13); SAVEPOINT two; INSERT INTO savepoints VALUES (14); ! ROLLBACK TO one; INSERT INTO savepoints VALUES (15); SAVEPOINT two; INSERT INTO savepoints VALUES (16); --- 170,176 ---- INSERT INTO savepoints VALUES (13); SAVEPOINT two; INSERT INTO savepoints VALUES (14); ! ROLLBACK TO SAVEPOINT one; INSERT INTO savepoints VALUES (15); SAVEPOINT two; INSERT INTO savepoints VALUES (16); *************** *** 185,193 **** INSERT INTO savepoints VALUES (19); SAVEPOINT two; INSERT INTO savepoints VALUES (20); ! ROLLBACK TO one; INSERT INTO savepoints VALUES (21); ! ROLLBACK TO one; INSERT INTO savepoints VALUES (22); COMMIT; SELECT a FROM savepoints WHERE a BETWEEN 18 AND 22; --- 185,193 ---- INSERT INTO savepoints VALUES (19); SAVEPOINT two; INSERT INTO savepoints VALUES (20); ! ROLLBACK TO SAVEPOINT one; INSERT INTO savepoints VALUES (21); ! ROLLBACK TO SAVEPOINT one; INSERT INTO savepoints VALUES (22); COMMIT; SELECT a FROM savepoints WHERE a BETWEEN 18 AND 22; *************** *** 196,211 **** -- only in a transaction block: SAVEPOINT one; ! ROLLBACK TO one; ! RELEASE one; -- Only "rollback to" allowed in aborted state BEGIN; SAVEPOINT one; SELECT 0/0; SAVEPOINT two; -- ignored till the end of ... ! RELEASE one; -- ignored till the end of ... ! ROLLBACK TO one; SELECT 1; COMMIT; SELECT 1; -- this should work --- 196,211 ---- -- only in a transaction block: SAVEPOINT one; ! ROLLBACK TO SAVEPOINT one; ! RELEASE SAVEPOINT one; -- Only "rollback to" allowed in aborted state BEGIN; SAVEPOINT one; SELECT 0/0; SAVEPOINT two; -- ignored till the end of ... ! RELEASE SAVEPOINT one; -- ignored till the end of ... ! ROLLBACK TO SAVEPOINT one; SELECT 1; COMMIT; SELECT 1; -- this should work *************** *** 215,233 **** DECLARE c CURSOR FOR SELECT unique2 FROM tenk1; SAVEPOINT one; FETCH 10 FROM c; ! ROLLBACK TO one; FETCH 10 FROM c; ! RELEASE one; FETCH 10 FROM c; CLOSE c; DECLARE c CURSOR FOR SELECT unique2/0 FROM tenk1; SAVEPOINT two; FETCH 10 FROM c; ! ROLLBACK TO two; -- c is now dead to the world ... FETCH 10 FROM c; ! ROLLBACK TO two; ! RELEASE two; FETCH 10 FROM c; COMMIT; --- 215,233 ---- DECLARE c CURSOR FOR SELECT unique2 FROM tenk1; SAVEPOINT one; FETCH 10 FROM c; ! ROLLBACK TO SAVEPOINT one; FETCH 10 FROM c; ! RELEASE SAVEPOINT one; FETCH 10 FROM c; CLOSE c; DECLARE c CURSOR FOR SELECT unique2/0 FROM tenk1; SAVEPOINT two; FETCH 10 FROM c; ! ROLLBACK TO SAVEPOINT two; -- c is now dead to the world ... FETCH 10 FROM c; ! ROLLBACK TO SAVEPOINT two; ! RELEASE SAVEPOINT two; FETCH 10 FROM c; COMMIT;