<!--
$PostgreSQL: pgsql/doc/src/sgml/ref/rollback_to.sgml,v 1.2 2004/08/12 19:12:21 tgl Exp $
PostgreSQL documentation
-->

<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">
  <primary>savepoints</primary>
  <secondary>rolling back</secondary>
 </indexterm>

 <refsynopsisdiv>
<synopsis>
ROLLBACK [ WORK | TRANSACTION ] TO [ SAVEPOINT ] <replaceable>savepoint_name</replaceable>
</synopsis>
 </refsynopsisdiv>

 <refsect1>
  <title>Description</title>

  <para>
   Roll back all commands that were executed after the savepoint was
   established.  The savepoint remains valid and can be rolled back to
   again later, if needed.
  </para>

  <para>
   <command>ROLLBACK TO SAVEPOINT</> implicitly destroys all savepoints that
   were established after the named savepoint.
  </para>
 </refsect1>

 <refsect1>
  <title>Parameters</title>

  <variablelist>
   <varlistentry>
    <term><replaceable class="PARAMETER">savepoint_name</></term>
    <listitem>
     <para>
      The savepoint to roll back to.
     </para>
    </listitem>
   </varlistentry>
  </variablelist>
 </refsect1>

 <refsect1>
  <title>Notes</title>

  <para>
   Use <xref linkend="SQL-RELEASE-SAVEPOINT"
   endterm="SQL-RELEASE-SAVEPOINT-TITLE"> to destroy a savepoint without
   discarding the effects of commands executed after it was established.
  </para>

  <para>
   Specifying a savepoint name that has not been established is an error.
  </para>

  <para>
   Cursors have somewhat non-transactional behavior with respect to
   savepoints.  Any cursor that is opened inside the savepoint is not closed
   when the savepoint is rolled back.  If a cursor is affected by a
   <command>FETCH</> command inside a savepoint that is later rolled
   back, the cursor position remains at the position that <command>FETCH</>
   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>

 <refsect1>
  <title>Examples</title>

  <para>
   To undo the effects of the commands executed after <literal>my_savepoint</literal>
   was established:
<programlisting>
ROLLBACK TO SAVEPOINT my_savepoint;
</programlisting>
  </para>

  <para>
   Cursor positions are not affected by savepoint rollback:
<programlisting>
BEGIN;

DECLARE foo CURSOR FOR SELECT 1 UNION SELECT 2;

SAVEPOINT foo;

FETCH 1 FROM foo;
 ?column? 
----------
        1

ROLLBACK TO SAVEPOINT foo;

FETCH 1 FROM foo;
 ?column? 
----------
        2

COMMIT;
</programlisting>
   </para>


 </refsect1>

 <refsect1>
  <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.  SQL2003 allows only
   WORK, not TRANSACTION, as a noise word after ROLLBACK.  Also, SQL2003
   has an optional clause AND [ NO ] CHAIN which is not currently supported
   by <productname>PostgreSQL</productname>.  Otherwise, this command is
   fully conforming.
  </para>
 </refsect1>

 <refsect1>
  <title>See Also</title>

  <simplelist type="inline">
   <member><xref linkend="sql-begin" endterm="sql-begin-title"></member>
   <member><xref linkend="sql-commit" endterm="sql-commit-title"></member>
   <member><xref linkend="sql-savepoint" endterm="sql-savepoint-title"></member>
   <member><xref linkend="sql-release-savepoint" endterm="sql-release-savepoint-title"></member>
   <member><xref linkend="sql-rollback" endterm="sql-rollback-title"></member>
  </simplelist>
 </refsect1>
</refentry>

<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:nil
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
sgml-parent-document:nil
sgml-default-dtd-file:"../reference.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:"/usr/lib/sgml/catalog"
sgml-local-ecat-files:nil
End:
-->
