]> granicus.if.org Git - postgresql/commitdiff
Prevent psql from issuing BEGIN before ALTER SYSTEM when AUTOCOMMIT is off.
authorFujii Masao <fujii@postgresql.org>
Wed, 2 Jul 2014 03:42:20 +0000 (12:42 +0900)
committerFujii Masao <fujii@postgresql.org>
Wed, 2 Jul 2014 03:43:09 +0000 (12:43 +0900)
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

src/bin/psql/common.c

index 60169a2a7dfae3213795f1aedcc9160b8951929e..c08c81366d11775381ce27e09d2a8b252aa5ca52 100644 (file)
@@ -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