diff options
author | Fujii Masao <fujii@postgresql.org> | 2014-07-02 12:42:20 +0900 |
---|---|---|
committer | Fujii Masao <fujii@postgresql.org> | 2014-07-02 12:43:09 +0900 |
commit | 5520006b5bbaa36e6734a8ccf960bb870f4a4fec (patch) | |
tree | 1e8f3045d3b603beb6e5b1c059a004b5e7d837c6 /src | |
parent | 49bca9ea53f6428f7ac6372ad4dd47ecacfac395 (diff) |
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.c | 17 |
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 |