diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2002-10-13 16:55:05 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2002-10-13 16:55:05 +0000 |
commit | ad4ce7aa5b7385a0481009d1b8d8774435b03b0d (patch) | |
tree | 0f0baebe82b0ec25b03cf51647bea1abe60bd70b /src/backend/tcop/postgres.c | |
parent | 5261bf9733f4f18f846e32ad968ae78696ce6319 (diff) | |
download | postgresql-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.c | 45 |
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"); } /* |