Make SET really not start a transaction.
authorTom Lane <[email protected]>
Sun, 13 Oct 2002 16:55:05 +0000 (16:55 +0000)
committerTom Lane <[email protected]>
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 60e7c9a20ff251f876102c79516130bed10c1441..6a00cca05e9f8eb4072451ff29d8b58fb83ad486 100644 (file)
@@ -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 fb49078244d4f40cabbe7c9d3d649a65d1f72a5b..d467d58858327cb06dce33bd48b9ea3395ecba10 100644 (file)
@@ -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 2b02e0f9ae1b0cf1e79a510a7be8a3676781665d..47e837e79b13bcf4e8e78aa9aa78be5dd2770f09 100644 (file)
@@ -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 04f137eee7847e3a4f9249841e35bed29dcdc015..f576109924aa7b8b4c42f4bd445c3b2d98ff7d6f 100644 (file)
@@ -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 481d0b120a14b8afcd9c398718b3be6aa2189f4d..a40a5bbd06ee986a13873578a12a943688b362dd 100644 (file)
@@ -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");
        }
 
        /*