Commit d015dcbe authored by Bruce Momjian's avatar Bruce Momjian

Have SET not start transaction when autocommit off, with doc updates.

parent eb949720
<!-- <!--
$Header: /cvsroot/pgsql/doc/src/sgml/ref/reset.sgml,v 1.15 2002/09/21 18:32:54 petere Exp $ $Header: /cvsroot/pgsql/doc/src/sgml/ref/reset.sgml,v 1.16 2002/10/09 04:59:38 momjian Exp $
PostgreSQL documentation PostgreSQL documentation
--> -->
...@@ -66,6 +66,12 @@ SET <replaceable class="parameter">variable</replaceable> TO DEFAULT ...@@ -66,6 +66,12 @@ SET <replaceable class="parameter">variable</replaceable> TO DEFAULT
switches, or per-database or per-user default settings. See the switches, or per-database or per-user default settings. See the
<citetitle>Administrator's Guide</citetitle> for details. <citetitle>Administrator's Guide</citetitle> for details.
</para> </para>
<para>
See the <command>SHOW</> manual page for details on the transaction
behavior of <command>RESET</>.
</para>
</refsect1> </refsect1>
<refsect1> <refsect1>
......
<!-- <!--
$Header: /cvsroot/pgsql/doc/src/sgml/ref/set.sgml,v 1.65 2002/09/21 18:32:54 petere Exp $ $Header: /cvsroot/pgsql/doc/src/sgml/ref/set.sgml,v 1.66 2002/10/09 04:59:38 momjian Exp $
PostgreSQL documentation PostgreSQL documentation
--> -->
...@@ -108,6 +108,12 @@ SET [ SESSION | LOCAL ] TIME ZONE { <replaceable class="PARAMETER">timezone</rep ...@@ -108,6 +108,12 @@ SET [ SESSION | LOCAL ] TIME ZONE { <replaceable class="PARAMETER">timezone</rep
is committed) the <command>SET</command> value will take effect. is committed) the <command>SET</command> value will take effect.
</para> </para>
<para>
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.
</para>
<para> <para>
Here are additional details about a few of the parameters that can be set: Here are additional details about a few of the parameters that can be set:
......
<!-- <!--
$Header: /cvsroot/pgsql/doc/src/sgml/runtime.sgml,v 1.143 2002/10/03 02:26:49 momjian Exp $ $Header: /cvsroot/pgsql/doc/src/sgml/runtime.sgml,v 1.144 2002/10/09 04:59:38 momjian Exp $
--> -->
<Chapter Id="runtime"> <Chapter Id="runtime">
...@@ -1235,16 +1235,32 @@ env PGOPTIONS='-c geqo=off' psql ...@@ -1235,16 +1235,32 @@ env PGOPTIONS='-c geqo=off' psql
that is not inside an explicit transaction block (that is, unless a that is not inside an explicit transaction block (that is, unless a
<command>BEGIN</> with no matching <command>COMMIT</> has been <command>BEGIN</> with no matching <command>COMMIT</> has been
given). given).
If set to false, <productname>PostgreSQL</productname> will commit If set to false, <productname>PostgreSQL</productname> will
the effects of commands only on receiving an explicit commit the commands only when receiving an explicit
<command>COMMIT</> command. This mode can also be thought of as <command>COMMIT</> command. This mode can also be thought of as
implicitly issuing <command>BEGIN</> whenever a command is received implicitly issuing <command>BEGIN</> whenever a command is
and <productname>PostgreSQL</productname> is not already inside received that is not already inside a transaction block. The
a transaction block. default is true, for compatibility with historical
The default is true, for compatibility with historical <productname>PostgreSQL</productname> behavior. However, for
<productname>PostgreSQL</productname> behavior. But for maximum maximum compatibility with the SQL specification, set it to
compatibility with the SQL specification, set it to false. false.
</para> </para>
<note>
<para>
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
<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</>
first.
</para>
</note>
</listitem> </listitem>
</varlistentry> </varlistentry>
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/tcop/postgres.c,v 1.299 2002/10/08 17:17:19 tgl Exp $ * $Header: /cvsroot/pgsql/src/backend/tcop/postgres.c,v 1.300 2002/10/09 04:59:38 momjian Exp $
* *
* NOTES * NOTES
* this is the "main" module of the postgres backend and * this is the "main" module of the postgres backend and
...@@ -76,6 +76,7 @@ char *debug_query_string; /* for pgmonitor and ...@@ -76,6 +76,7 @@ char *debug_query_string; /* for pgmonitor and
CommandDest whereToSendOutput = Debug; CommandDest whereToSendOutput = Debug;
extern int StatementTimeout; extern int StatementTimeout;
extern bool autocommit;
static bool dontExecute = false; static bool dontExecute = false;
...@@ -122,7 +123,7 @@ static int ReadCommand(StringInfo inBuf); ...@@ -122,7 +123,7 @@ static int ReadCommand(StringInfo inBuf);
static List *pg_parse_query(StringInfo query_string, Oid *typev, int nargs); static List *pg_parse_query(StringInfo query_string, Oid *typev, int nargs);
static List *pg_analyze_and_rewrite(Node *parsetree); static List *pg_analyze_and_rewrite(Node *parsetree);
static void start_xact_command(void); static void start_xact_command(void);
static void finish_xact_command(void); static void finish_xact_command(bool forceCommit);
static void SigHupHandler(SIGNAL_ARGS); static void SigHupHandler(SIGNAL_ARGS);
static void FloatExceptionHandler(SIGNAL_ARGS); static void FloatExceptionHandler(SIGNAL_ARGS);
static const char *CreateCommandTag(Node *parsetree); static const char *CreateCommandTag(Node *parsetree);
...@@ -825,7 +826,7 @@ pg_exec_query_string(StringInfo query_string, /* string to execute */ ...@@ -825,7 +826,7 @@ pg_exec_query_string(StringInfo query_string, /* string to execute */
*/ */
if (isTransactionStmt) if (isTransactionStmt)
{ {
finish_xact_command(); finish_xact_command(false);
xact_started = false; xact_started = false;
} }
} /* end loop over queries generated from a } /* end loop over queries generated from a
...@@ -843,7 +844,19 @@ pg_exec_query_string(StringInfo query_string, /* string to execute */ ...@@ -843,7 +844,19 @@ pg_exec_query_string(StringInfo query_string, /* string to execute */
*/ */
if (lnext(parsetree_item) == NIL && xact_started) if (lnext(parsetree_item) == NIL && xact_started)
{ {
finish_xact_command(); /*
* 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);
xact_started = false; xact_started = false;
} }
...@@ -878,7 +891,7 @@ pg_exec_query_string(StringInfo query_string, /* string to execute */ ...@@ -878,7 +891,7 @@ pg_exec_query_string(StringInfo query_string, /* string to execute */
* will only happen if the querystring was empty.) * will only happen if the querystring was empty.)
*/ */
if (xact_started) if (xact_started)
finish_xact_command(); finish_xact_command(false);
if (save_Log_duration) if (save_Log_duration)
{ {
...@@ -907,7 +920,7 @@ start_xact_command(void) ...@@ -907,7 +920,7 @@ start_xact_command(void)
} }
static void static void
finish_xact_command(void) finish_xact_command(bool forceCommit)
{ {
/* Invoke IMMEDIATE constraint triggers */ /* Invoke IMMEDIATE constraint triggers */
DeferredTriggerEndQuery(); DeferredTriggerEndQuery();
...@@ -915,7 +928,7 @@ finish_xact_command(void) ...@@ -915,7 +928,7 @@ finish_xact_command(void)
/* Now commit the command */ /* Now commit the command */
elog(DEBUG1, "CommitTransactionCommand"); elog(DEBUG1, "CommitTransactionCommand");
CommitTransactionCommand(false); CommitTransactionCommand(forceCommit);
#ifdef SHOW_MEMORY_STATS #ifdef SHOW_MEMORY_STATS
/* Print mem stats at each commit for leak tracking */ /* Print mem stats at each commit for leak tracking */
...@@ -1720,7 +1733,7 @@ PostgresMain(int argc, char *argv[], const char *username) ...@@ -1720,7 +1733,7 @@ PostgresMain(int argc, char *argv[], const char *username)
if (!IsUnderPostmaster) if (!IsUnderPostmaster)
{ {
puts("\nPOSTGRES backend interactive interface "); puts("\nPOSTGRES backend interactive interface ");
puts("$Revision: 1.299 $ $Date: 2002/10/08 17:17:19 $\n"); puts("$Revision: 1.300 $ $Date: 2002/10/09 04:59:38 $\n");
} }
/* /*
...@@ -1923,7 +1936,7 @@ PostgresMain(int argc, char *argv[], const char *username) ...@@ -1923,7 +1936,7 @@ PostgresMain(int argc, char *argv[], const char *username)
} }
/* commit the function-invocation transaction */ /* commit the function-invocation transaction */
finish_xact_command(); finish_xact_command(false);
break; break;
/* /*
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment