Only DISCARD ALL should be in the command_no_begin list.
authorItagaki Takahiro <itagaki.takahiro@gmail.com>
Tue, 28 Sep 2010 06:55:25 +0000 (15:55 +0900)
committerItagaki Takahiro <itagaki.takahiro@gmail.com>
Tue, 28 Sep 2010 06:55:25 +0000 (15:55 +0900)
We allowes DISCARD PLANS and TEMP in a transaction.

src/bin/psql/common.c

index 7ba2f73c5d0a664f1104a3520d2fbb3f898333a9..50e4077343a9209c74c421e033f55a3003296215 100644 (file)
@@ -1388,8 +1388,20 @@ command_no_begin(const char *query)
            return true;
    }
 
+   /* DISCARD ALL isn't allowed in xacts, but other variants are allowed. */
    if (wordlen == 7 && pg_strncasecmp(query, "discard", 7) == 0)
-       return true;
+   {
+       query += wordlen;
+
+       query = skip_white_space(query);
+
+       wordlen = 0;
+       while (isalpha((unsigned char) query[wordlen]))
+           wordlen += PQmblen(&query[wordlen], pset.encoding);
+
+       if (wordlen == 3 && pg_strncasecmp(query, "all", 3) == 0)
+           return true;
+   }
 
    return false;
 }