OSDN Git Service

Make SET really not start a transaction.
authorTom Lane <tgl@sss.pgh.pa.us>
Sun, 13 Oct 2002 16:55:05 +0000 (16:55 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Sun, 13 Oct 2002 16:55:05 +0000 (16:55 +0000)
doc/src/sgml/ref/reset.sgml
doc/src/sgml/ref/set.sgml
doc/src/sgml/ref/show.sgml
doc/src/sgml/runtime.sgml
src/backend/tcop/postgres.c

index a21aa02..ed36d54 100644 (file)
@@ -1,5 +1,5 @@
 <!--
-$Header: /cvsroot/pgsql/doc/src/sgml/ref/reset.sgml,v 1.16 2002/10/09 04:59:38 momjian Exp $
+$Header: /cvsroot/pgsql/doc/src/sgml/ref/reset.sgml,v 1.17 2002/10/13 16:55:05 tgl Exp $
 PostgreSQL documentation
 -->
 
@@ -68,7 +68,7 @@ SET <replaceable class="parameter">variable</replaceable> TO DEFAULT
   </para>
 
   <para>
-   See the <command>SHOW</> manual page for details on the transaction
+   See the <command>SET</> manual page for details on the transaction
    behavior of <command>RESET</>.
   </para>
 
index 4ee941b..71e35b5 100644 (file)
@@ -1,5 +1,5 @@
 <!--
-$Header: /cvsroot/pgsql/doc/src/sgml/ref/set.sgml,v 1.67 2002/10/09 16:27:48 momjian Exp $
+$Header: /cvsroot/pgsql/doc/src/sgml/ref/set.sgml,v 1.68 2002/10/13 16:55:05 tgl Exp $
 PostgreSQL documentation
 -->
 
@@ -109,9 +109,10 @@ SET [ SESSION | LOCAL ] TIME ZONE { <replaceable class="PARAMETER">timezone</rep
   </para>
 
   <para>
-   With <literal>autocommit</> set to <literal>off</>, <command>SET</>
+   Even with <literal>autocommit</> set to <literal>off</>, <command>SET</>
    does not start a new transaction block. See the
-   <literal>autocommit</> section of the documentation for details.
+   <literal>autocommit</> section of the <citetitle>Administrator's
+   Guide</citetitle> for details.
   </para>
 
   <para>
index f42893f..2f086ee 100644 (file)
@@ -1,5 +1,5 @@
 <!--
-$Header: /cvsroot/pgsql/doc/src/sgml/ref/show.sgml,v 1.21 2002/09/01 01:59:48 momjian Exp $
+$Header: /cvsroot/pgsql/doc/src/sgml/ref/show.sgml,v 1.22 2002/10/13 16:55:05 tgl Exp $
 PostgreSQL documentation
 -->
 
@@ -60,6 +60,13 @@ SHOW ALL
    command-line flag when starting the
    <application>postmaster</application>.
   </para>
+
+  <para>
+   Even with <literal>autocommit</> set to <literal>off</>, <command>SHOW</>
+   does not start a new transaction block. See the
+   <literal>autocommit</> section of the <citetitle>Administrator's
+   Guide</citetitle> for details.
+  </para>
  </refsect1>
 
  <refsect1>
index 2936e9b..fc878e6 100644 (file)
@@ -1,5 +1,5 @@
 <!--
-$Header: /cvsroot/pgsql/doc/src/sgml/runtime.sgml,v 1.144 2002/10/09 04:59:38 momjian Exp $
+$Header: /cvsroot/pgsql/doc/src/sgml/runtime.sgml,v 1.145 2002/10/13 16:55:05 tgl Exp $
 -->
 
 <Chapter Id="runtime">
@@ -1236,7 +1236,7 @@ env PGOPTIONS='-c geqo=off' psql
        <command>BEGIN</> with no matching <command>COMMIT</> has been
        given).
        If set to false, <productname>PostgreSQL</productname> will
-       commit the commands only when receiving an explicit
+       commit only upon receiving an explicit
        <command>COMMIT</> command. This mode can also be thought of as
        implicitly issuing <command>BEGIN</> whenever a command is
        received that is not already inside a transaction block. The
@@ -1247,16 +1247,16 @@ env PGOPTIONS='-c geqo=off' psql
        </para>
        <note>
         <para>
-        With <varname>autocommit</> set to false, <command>SET</>,
+        Even with <varname>autocommit</> set to false, <command>SET</>,
         <command>SHOW</>, and <command>RESET</> do not start new
         transaction blocks. They are run in their own transactions.
-        Once another command is issued, multi-statement transaction
-        behavior begins and any <command>SET</>, <command>SHOW</>, or
+        Once another command is issued, a transaction block
+        begins and any <command>SET</>, <command>SHOW</>, or
         <command>RESET</> commands are considered to be part of the
         transaction, i.e. they are committed or rolled back depending
-        on the completion status of the transaction. To have
-        <command>SET</>, <command>SHOW</>, and <command>RESET</>
-        commands at the start of a transaction, use <command>BEGIN</>
+        on the completion status of the transaction. To execute a
+        <command>SET</>, <command>SHOW</>, or <command>RESET</>
+        command at the start of a transaction block, use <command>BEGIN</>
         first.
         </para>
        </note>
index 1b60326..1b636c1 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/tcop/postgres.c,v 1.300 2002/10/09 04:59:38 momjian Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/tcop/postgres.c,v 1.301 2002/10/13 16:55:05 tgl Exp $
  *
  * NOTES
  *       this is the "main" module of the postgres backend and
@@ -76,7 +76,6 @@ char     *debug_query_string; /* for pgmonitor and
 CommandDest whereToSendOutput = Debug;
 
 extern int     StatementTimeout;
-extern bool autocommit;
 
 static bool dontExecute = false;
 
@@ -620,15 +619,11 @@ pg_exec_query_string(StringInfo query_string,     /* string to execute */
        foreach(parsetree_item, parsetree_list)
        {
                Node       *parsetree = (Node *) lfirst(parsetree_item);
-               bool            isTransactionStmt;
                const char *commandTag;
                char            completionTag[COMPLETION_TAG_BUFSIZE];
                List       *querytree_list,
                                   *querytree_item;
 
-               /* Transaction control statements need some special handling */
-               isTransactionStmt = IsA(parsetree, TransactionStmt);
-
                /*
                 * First we set the command-completion tag to the main query (as
                 * opposed to each of the others that may be generated by analyze
@@ -653,7 +648,7 @@ pg_exec_query_string(StringInfo query_string,       /* string to execute */
                {
                        bool            allowit = false;
 
-                       if (isTransactionStmt)
+                       if (IsA(parsetree, TransactionStmt))
                        {
                                TransactionStmt *stmt = (TransactionStmt *) parsetree;
 
@@ -698,6 +693,7 @@ pg_exec_query_string(StringInfo query_string,       /* string to execute */
                foreach(querytree_item, querytree_list)
                {
                        Query      *querytree = (Query *) lfirst(querytree_item);
+                       bool            endTransactionBlock = false;
 
                        /* Make sure we are in a transaction command */
                        if (!xact_started)
@@ -733,6 +729,13 @@ pg_exec_query_string(StringInfo query_string,      /* string to execute */
                                        IsA(utilityStmt, ReindexStmt))
                                        SetQuerySnapshot();
 
+                               /* end transaction block if transaction or variable stmt */
+                               if (IsA(utilityStmt, TransactionStmt) ||
+                                       IsA(utilityStmt, VariableSetStmt) ||
+                                       IsA(utilityStmt, VariableShowStmt) ||
+                                       IsA(utilityStmt, VariableResetStmt))
+                                       endTransactionBlock = true;
+
                                if (querytree->originalQuery)
                                {
                                        /* utility statement can override default tag string */
@@ -805,7 +808,7 @@ pg_exec_query_string(StringInfo query_string,       /* string to execute */
                         * visible to subsequent ones.  In particular we'd better do
                         * so before checking constraints.
                         */
-                       if (!isTransactionStmt)
+                       if (!endTransactionBlock)
                                CommandCounterIncrement();
 
                        /*
@@ -820,13 +823,13 @@ pg_exec_query_string(StringInfo query_string,     /* string to execute */
                        MemoryContextResetAndDeleteChildren(CurrentMemoryContext);
 
                        /*
-                        * If this was a transaction control statement, commit it and
-                        * arrange to start a new xact command for the next command
-                        * (if any).
+                        * If this was a transaction control statement or a variable
+                        * set/show/reset statement, commit it and arrange to start a
+                        * new xact command for the next command (if any).
                         */
-                       if (isTransactionStmt)
+                       if (endTransactionBlock)
                        {
-                               finish_xact_command(false);
+                               finish_xact_command(true);
                                xact_started = false;
                        }
                }                                               /* end loop over queries generated from a
@@ -844,19 +847,7 @@ pg_exec_query_string(StringInfo query_string,      /* string to execute */
                 */
                if (lnext(parsetree_item) == NIL && xact_started)
                {
-                       /*
-                        *      Don't allow SET/SHOW/RESET to start a new transaction
-                        *      with autocommit off.  We do this by forcing a COMMIT
-                        *      when these commands start a transaction.
-                        */
-                       if (autocommit ||
-                               IsTransactionState() ||
-                               (strcmp(commandTag, "SET") != 0 &&
-                                strcmp(commandTag, "SHOW") != 0 &&
-                                strcmp(commandTag, "RESET") != 0))
-                               finish_xact_command(false);
-                       else
-                               finish_xact_command(true);
+                       finish_xact_command(false);
                        xact_started = false;
                }
 
@@ -1733,7 +1724,7 @@ PostgresMain(int argc, char *argv[], const char *username)
        if (!IsUnderPostmaster)
        {
                puts("\nPOSTGRES backend interactive interface ");
-               puts("$Revision: 1.300 $ $Date: 2002/10/09 04:59:38 $\n");
+               puts("$Revision: 1.301 $ $Date: 2002/10/13 16:55:05 $\n");
        }
 
        /*