aboutsummaryrefslogtreecommitdiff
path: root/src/backend/tcop/postgres.c
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2002-10-13 16:55:05 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2002-10-13 16:55:05 +0000
commitad4ce7aa5b7385a0481009d1b8d8774435b03b0d (patch)
tree0f0baebe82b0ec25b03cf51647bea1abe60bd70b /src/backend/tcop/postgres.c
parent5261bf9733f4f18f846e32ad968ae78696ce6319 (diff)
downloadpostgresql-ad4ce7aa5b7385a0481009d1b8d8774435b03b0d.tar.gz
postgresql-ad4ce7aa5b7385a0481009d1b8d8774435b03b0d.zip
Make SET really not start a transaction.
Diffstat (limited to 'src/backend/tcop/postgres.c')
-rw-r--r--src/backend/tcop/postgres.c45
1 files changed, 18 insertions, 27 deletions
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");
}
/*