Tom Lane wrote:
Oliver Jowett <[EMAIL PROTECTED]> writes:

<release savepoint statement> ::= RELEASE SAVEPOINT <savepoint specifier>


Oracle does not have RELEASE SAVEPOINT.
DB2 has RELEASE [ TO ] SAVEPOINT <savepoint specifier>


I'd vote for RELEASE [ SAVEPOINT ] <name> (for brevity, and for
consistency with ROLLBACK).  I feel no urge to copy DB2.

Here's an updated patch that supports the syntax you suggest. I kept the error messages, doc examples and regression tests using RELEASE SAVEPOINT in full to follow the standard.


-O
? 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       12 Aug 2004 11:15:33 -0000
***************
*** 5,21 ****
  
  <refentry id="SQL-RELEASE">
   <refmeta>
!   <refentrytitle id="SQL-RELEASE-TITLE">RELEASE</refentrytitle>
    <refmiscinfo>SQL - Language Statements</refmiscinfo>
   </refmeta>
  
   <refnamediv>
!   <refname>RELEASE</refname>
    <refpurpose>destroy a previously defined savepoint</refpurpose>
   </refnamediv>
  
   <indexterm zone="sql-release">
!   <primary>RELEASE</primary>
   </indexterm>
  
   <indexterm zone="sql-release">
--- 5,21 ----
  
  <refentry id="SQL-RELEASE">
   <refmeta>
!   <refentrytitle id="SQL-RELEASE-TITLE">RELEASE SAVEPOINT</refentrytitle>
    <refmiscinfo>SQL - Language Statements</refmiscinfo>
   </refmeta>
  
   <refnamediv>
!   <refname>RELEASE SAVEPOINT</refname>
    <refpurpose>destroy a previously defined savepoint</refpurpose>
   </refnamediv>
  
   <indexterm zone="sql-release">
!   <primary>RELEASE SAVEPOINT</primary>
   </indexterm>
  
   <indexterm zone="sql-release">
***************
*** 25,31 ****
  
   <refsynopsisdiv>
  <synopsis>
! RELEASE <replaceable>savepoint_name</replaceable>
  </synopsis>
   </refsynopsisdiv>
    
--- 25,31 ----
  
   <refsynopsisdiv>
  <synopsis>
! RELEASE [ SAVEPOINT ] <replaceable>savepoint_name</replaceable>
  </synopsis>
   </refsynopsisdiv>
    
***************
*** 33,39 ****
    <title>Description</title>
  
    <para>
!    <command>RELEASE</command> destroys a savepoint previously defined
     in the current transaction.
    </para>
  
--- 33,39 ----
    <title>Description</title>
  
    <para>
!    <command>RELEASE SAVEPOINT</command> destroys a savepoint previously defined
     in the current transaction.
    </para>
  
***************
*** 48,54 ****
    </para>
  
    <para>
!    <command>RELEASE</command> also destroys all savepoints that were
     established after the named savepoint was established.
    </para>
   </refsect1>
--- 48,54 ----
    </para>
  
    <para>
!    <command>RELEASE SAVEPOINT</command> also destroys all savepoints that were
     established after the named savepoint was established.
    </para>
   </refsect1>
***************
*** 97,103 ****
      INSERT INTO table VALUES (3);
      SAVEPOINT my_savepoint;
      INSERT INTO table VALUES (4);
!     RELEASE my_savepoint;
  COMMIT;
  </programlisting>
     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;
  </programlisting>
     The above transaction will insert both 3 and 4.
***************
*** 108,114 ****
    <title>Compatibility</title>
    
    <para>
!    RELEASE is fully conforming to the SQL standard.
    </para>
   </refsect1>
  
--- 108,116 ----
    <title>Compatibility</title>
    
    <para>
!    The SQL2003 standard specifies that the keyword SAVEPOINT is mandatory.
!    <productname>PostgreSQL</productname> allows the SAVEPOINT keyword to be
!    omitted. Otherwise, this command is fully conforming.
    </para>
   </refsect1>
  
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   12 Aug 2004 11:15:33 -0000
***************
*** 5,21 ****
  
  <refentry id="SQL-ROLLBACK-TO">
   <refmeta>
!   <refentrytitle id="SQL-ROLLBACK-TO-TITLE">ROLLBACK TO</refentrytitle>
    <refmiscinfo>SQL - Language Statements</refmiscinfo>
   </refmeta>
  
   <refnamediv>
!   <refname>ROLLBACK TO</refname>
    <refpurpose>roll back to a savepoint</refpurpose>
   </refnamediv>
  
   <indexterm zone="sql-rollback-to">
!   <primary>ROLLBACK TO</primary>
   </indexterm>
  
   <indexterm zone="sql-rollback-to">
--- 5,21 ----
  
  <refentry id="SQL-ROLLBACK-TO">
   <refmeta>
!   <refentrytitle id="SQL-ROLLBACK-TO-TITLE">ROLLBACK TO SAVEPOINT</refentrytitle>
    <refmiscinfo>SQL - Language Statements</refmiscinfo>
   </refmeta>
  
   <refnamediv>
!   <refname>ROLLBACK TO SAVEPOINT</refname>
    <refpurpose>roll back to a savepoint</refpurpose>
   </refnamediv>
  
   <indexterm zone="sql-rollback-to">
!   <primary>ROLLBACK TO SAVEPOINT</primary>
   </indexterm>
  
   <indexterm zone="sql-rollback-to">
***************
*** 25,31 ****
  
   <refsynopsisdiv>
  <synopsis>
! ROLLBACK TO <replaceable>savepoint_name</replaceable>
  </synopsis>
   </refsynopsisdiv>
  
--- 25,31 ----
  
   <refsynopsisdiv>
  <synopsis>
! ROLLBACK [ WORK | TRANSACTION ] TO [ SAVEPOINT ] 
<replaceable>savepoint_name</replaceable>
  </synopsis>
   </refsynopsisdiv>
  
***************
*** 39,45 ****
    </para>
  
    <para>
!    <command>ROLLBACK TO</> implicitly destroys all savepoints that
     were established after the named savepoint.
    </para>
   </refsect1>
--- 39,45 ----
    </para>
  
    <para>
!    <command>ROLLBACK TO SAVEPOINT</> implicitly destroys all savepoints that
     were established after the named savepoint.
    </para>
   </refsect1>
***************
*** 81,87 ****
     left it pointing to (that is, <command>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
!    <command>ROLLBACK TO</>, the cursor can no longer be used.
    </para>
   </refsect1>
  
--- 81,87 ----
     left it pointing to (that is, <command>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
!    <command>ROLLBACK TO SAVEPOINT</>, the cursor can no longer be used.
    </para>
   </refsect1>
  
***************
*** 92,98 ****
     To undo the effects of the commands executed after <literal>my_savepoint</literal>
     was established:
  <programlisting>
! ROLLBACK TO my_savepoint;
  </programlisting>
    </para>
  
--- 92,98 ----
     To undo the effects of the commands executed after <literal>my_savepoint</literal>
     was established:
  <programlisting>
! ROLLBACK TO SAVEPOINT my_savepoint;
  </programlisting>
    </para>
  
***************
*** 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 ****
    <title>Compatibility</title>
  
    <para>
!    This command is fully SQL standard conforming.
    </para>
   </refsect1>
  
--- 128,137 ----
    <title>Compatibility</title>
  
    <para>
!    The SQL2003 standard specifies that the keyword SAVEPOINT is mandatory.
!    <productname>PostgreSQL</productname> and <productname>Oracle</productname>
!    allow the SAVEPOINT keyword to be omitted. Otherwise, this command is
!    fully conforming.
    </para>
   </refsect1>
  
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   12 Aug 2004 11:15:35 -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_savepoint ColId
                                {
                                        TransactionStmt *n = makeNode(TransactionStmt);
                                        n->kind = TRANS_STMT_RELEASE;
                                        n->options = 
list_make1(makeDefElem("savepoint_name",
!                                                                                      
                         (Node *)makeString($3)));
                                        $$ = (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,4014 ----
                        | /*EMPTY*/                                                    
         {}
                ;
  
+ opt_savepoint:        SAVEPOINT                                                      
 {}
+                       | /*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  12 Aug 2004 11:15:35 -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  12 Aug 2004 11:15:40 -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       12 Aug 2004 11:15:40 -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;
  
---------------------------(end of broadcast)---------------------------
TIP 2: you can get off all lists at once with the unregister command
    (send "unregister YourEmailAddressHere" to [EMAIL PROTECTED])

Reply via email to