diff options
author | Tom Lane | 2002-10-13 16:55:05 +0000 |
---|---|---|
committer | Tom Lane | 2002-10-13 16:55:05 +0000 |
commit | ad4ce7aa5b7385a0481009d1b8d8774435b03b0d (patch) | |
tree | 0f0baebe82b0ec25b03cf51647bea1abe60bd70b | |
parent | 5261bf9733f4f18f846e32ad968ae78696ce6319 (diff) |
Make SET really not start a transaction.
-rw-r--r-- | doc/src/sgml/ref/reset.sgml | 4 | ||||
-rw-r--r-- | doc/src/sgml/ref/set.sgml | 7 | ||||
-rw-r--r-- | doc/src/sgml/ref/show.sgml | 9 | ||||
-rw-r--r-- | doc/src/sgml/runtime.sgml | 16 | ||||
-rw-r--r-- | src/backend/tcop/postgres.c | 45 |
5 files changed, 40 insertions, 41 deletions
diff --git a/doc/src/sgml/ref/reset.sgml b/doc/src/sgml/ref/reset.sgml index a21aa0239fb..ed36d549c52 100644 --- a/doc/src/sgml/ref/reset.sgml +++ b/doc/src/sgml/ref/reset.sgml @@ -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> diff --git a/doc/src/sgml/ref/set.sgml b/doc/src/sgml/ref/set.sgml index 4ee941be37b..71e35b50a5e 100644 --- a/doc/src/sgml/ref/set.sgml +++ b/doc/src/sgml/ref/set.sgml @@ -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> diff --git a/doc/src/sgml/ref/show.sgml b/doc/src/sgml/ref/show.sgml index f42893ffb25..2f086ee8a2d 100644 --- a/doc/src/sgml/ref/show.sgml +++ b/doc/src/sgml/ref/show.sgml @@ -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> diff --git a/doc/src/sgml/runtime.sgml b/doc/src/sgml/runtime.sgml index 2936e9b4c70..fc878e678c5 100644 --- a/doc/src/sgml/runtime.sgml +++ b/doc/src/sgml/runtime.sgml @@ -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> diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c index 1b603266095..1b636c18d73 100644 --- a/src/backend/tcop/postgres.c +++ b/src/backend/tcop/postgres.c @@ -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"); } /* |