mirror of
https://git.postgresql.org/git/postgresql.git
synced 2025-02-23 19:39:53 +08:00
Have SET not start transaction when autocommit off, with doc updates.
This commit is contained in:
parent
eb949720ad
commit
d015dcbe4e
@ -1,5 +1,5 @@
|
|||||||
<!--
|
<!--
|
||||||
$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
|
|||||||
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>
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<!--
|
<!--
|
||||||
$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
|
|||||||
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:
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<!--
|
<!--
|
||||||
$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
|
|||||||
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 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* 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
|
|||||||
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);
|
|||||||
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 */
|
|||||||
*/
|
*/
|
||||||
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 */
|
|||||||
*/
|
*/
|
||||||
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 */
|
|||||||
* 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)
|
|||||||
}
|
}
|
||||||
|
|
||||||
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)
|
|||||||
/* 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)
|
|||||||
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)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* commit the function-invocation transaction */
|
/* commit the function-invocation transaction */
|
||||||
finish_xact_command();
|
finish_xact_command(false);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Loading…
Reference in New Issue
Block a user