diff --git a/doc/src/sgml/ref/analyze.sgml b/doc/src/sgml/ref/analyze.sgml
index eec7599f148..40b43ee5a9c 100755
--- a/doc/src/sgml/ref/analyze.sgml
+++ b/doc/src/sgml/ref/analyze.sgml
@@ -21,7 +21,16 @@ PostgreSQL documentation
-ANALYZE [ VERBOSE ] [ table_name [ ( column_name [, ...] ) ] ]
+ANALYZE [ ( option [, ...] ) ] [ table_and_columns [, ...] ]
+ANALYZE [ VERBOSE ] [ table_and_columns [, ...] ]
+
+where option can be one of:
+
+ VERBOSE
+
+and table_and_columns is:
+
+ table_name [ ( column_name [, ...] ) ]
@@ -43,6 +52,13 @@ ANALYZE [ VERBOSE ] [ table_name [
only that table. It is further possible to give a list of column names,
in which case only the statistics for those columns are collected.
+
+
+ When the option list is surrounded by parentheses, the options can be
+ written in any order. The parenthesized syntax was added in
+ PostgreSQL 11; the unparenthesized syntax
+ is deprecated.
+
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index 754d0585304..dd45fa6e2f3 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -304,7 +304,8 @@ static Node *makeIsNotDistinctFromNode(Node *expr, int position);
%type opt_lock lock_type cast_context
%type vacuum_option_list vacuum_option_elem
-%type opt_force opt_or_replace
+ analyze_option_list analyze_option_elem
+%type opt_or_replace opt_force
opt_grant_grant_option opt_grant_admin_option
opt_nowait opt_if_exists opt_with_data opt_masteronly
@@ -11498,6 +11499,21 @@ AnalyzeStmt:
n->va_cols = $6;
$$ = (Node *)n;
}
+ | analyze_keyword '(' analyze_option_list ')'
+ {
+ VacuumStmt *n = makeNode(VacuumStmt);
+ n->options = VACOPT_ANALYZE | $3;
+ $$ = (Node *) n;
+ }
+ ;
+
+analyze_option_list:
+ analyze_option_elem { $$ = $1; }
+ | analyze_option_list ',' analyze_option_elem { $$ = $1 | $3; }
+ ;
+
+analyze_option_elem:
+ VERBOSE { $$ = VACOPT_VERBOSE; }
;
analyze_keyword:
diff --git a/src/test/regress/expected/vacuum.out b/src/test/regress/expected/vacuum.out
index 60364cd6bf9..4bbf88d6d3e 100755
--- a/src/test/regress/expected/vacuum.out
+++ b/src/test/regress/expected/vacuum.out
@@ -84,5 +84,35 @@ VACUUM ANALYZE vaccluster(i,i);
ERROR: column "i" of relation "vaccluster" appears more than once
ANALYZE vaccluster(i,i);
ERROR: column "i" of relation "vaccluster" appears more than once
+VACUUM ANALYZE vacparted(a,b,a);
+ERROR: column "a" of relation "vacparted" appears more than once
+ANALYZE vacparted(a,b,b);
+ERROR: column "b" of relation "vacparted" appears more than once
+-- multiple tables specified
+VACUUM vaccluster, vactst;
+VACUUM vacparted, does_not_exist;
+ERROR: relation "does_not_exist" does not exist
+VACUUM (FREEZE) vacparted, vaccluster, vactst;
+VACUUM (FREEZE) does_not_exist, vaccluster;
+ERROR: relation "does_not_exist" does not exist
+VACUUM ANALYZE vactst, vacparted (a);
+VACUUM ANALYZE vactst (does_not_exist), vacparted (b);
+ERROR: column "does_not_exist" of relation "vactst" does not exist
+VACUUM FULL vacparted, vactst;
+VACUUM FULL vactst, vacparted (a, b), vaccluster (i);
+ERROR: ANALYZE option must be specified when a column list is provided
+ANALYZE vactst, vacparted;
+ANALYZE vacparted (b), vactst;
+ANALYZE vactst, does_not_exist, vacparted;
+ERROR: relation "does_not_exist" does not exist
+ANALYZE vactst (i), vacparted (does_not_exist);
+ERROR: column "does_not_exist" of relation "vacparted" does not exist
+-- parenthesized syntax for ANALYZE
+ANALYZE (VERBOSE) does_not_exist;
+ERROR: relation "does_not_exist" does not exist
+ANALYZE (nonexistant-arg) does_not_exist;
+ERROR: syntax error at or near "nonexistant"
+LINE 1: ANALYZE (nonexistant-arg) does_not_exist;
+ ^
DROP TABLE vaccluster;
DROP TABLE vactst;
diff --git a/src/test/regress/sql/vacuum.sql b/src/test/regress/sql/vacuum.sql
index 2f657269c6f..20bedbc905e 100644
--- a/src/test/regress/sql/vacuum.sql
+++ b/src/test/regress/sql/vacuum.sql
@@ -67,5 +67,9 @@ VACUUM FULL vactst;
VACUUM ANALYZE vaccluster(i,i);
ANALYZE vaccluster(i,i);
+-- parenthesized syntax for ANALYZE
+ANALYZE (VERBOSE) does_not_exist;
+ANALYZE (nonexistant-arg) does_not_exist;
+
DROP TABLE vaccluster;
DROP TABLE vactst;