aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorFujii Masao <fujii@postgresql.org>2014-07-02 12:42:20 +0900
committerFujii Masao <fujii@postgresql.org>2014-07-02 12:42:20 +0900
commitd97e98e8337e915e3404f7b2a8a6b966b6f5394f (patch)
treea050b06148339ece24ac68b2a6a76b8e93011dba /src
parentfbb1d7d73f8e23a3a61e702629c53cef48cb0918 (diff)
downloadpostgresql-d97e98e8337e915e3404f7b2a8a6b966b6f5394f.tar.gz
postgresql-d97e98e8337e915e3404f7b2a8a6b966b6f5394f.zip
Prevent psql from issuing BEGIN before ALTER SYSTEM when AUTOCOMMIT is off.
The autocommit-off mode works by issuing an implicit BEGIN just before any command that is not already in a transaction block and is not itself a BEGIN or other transaction-control command, nor a command that cannot be executed inside a transaction block. This commit prevents psql from issuing such an implicit BEGIN before ALTER SYSTEM because it's not allowed inside a transaction block. Backpatch to 9.4 where ALTER SYSTEM was added. Report by Feike Steenbergen
Diffstat (limited to 'src')
-rw-r--r--src/bin/psql/common.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c
index 60169a2a7df..c08c81366d1 100644
--- a/src/bin/psql/common.c
+++ b/src/bin/psql/common.c
@@ -1524,6 +1524,23 @@ command_no_begin(const char *query)
return false;
}
+ if (wordlen == 5 && pg_strncasecmp(query, "alter", 5) == 0)
+ {
+ query += wordlen;
+
+ query = skip_white_space(query);
+
+ wordlen = 0;
+ while (isalpha((unsigned char) query[wordlen]))
+ wordlen += PQmblen(&query[wordlen], pset.encoding);
+
+ /* ALTER SYSTEM isn't allowed in xacts */
+ if (wordlen == 6 && pg_strncasecmp(query, "system", 6) == 0)
+ return true;
+
+ return false;
+ }
+
/*
* Note: these tests will match DROP SYSTEM and REINDEX TABLESPACE, which
* aren't really valid commands so we don't care much. The other four