On Thu, Jul 24, 2025 at 11:54:10AM +0200, Álvaro Herrera wrote:
> Yeah, thanks for taking a look.  That duplication is just me being dumb.
> Here's a version without that.  The only thing that needed to change was
> changing "CLUSTER opt_verbose" to "CLUSTER VERBOSE" so that the
> unadorned CLUSTER is handled by "CLUSTER opt_utility_option_list"
> instead.

I think we can do something similar for ANALYZE.  But AFAICT you're right
that we can't use it for VACUUM and EXPLAIN, at least not easily.

diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index fc9a8d64c08..7d341a319e7 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -11987,24 +11987,21 @@ VacuumStmt: VACUUM opt_full opt_freeze opt_verbose 
opt_analyze opt_vacuum_relati
                 }
         ;

-AnalyzeStmt: analyze_keyword opt_verbose opt_vacuum_relation_list
+AnalyzeStmt: analyze_keyword opt_utility_option_list opt_vacuum_relation_list
                 {
                     VacuumStmt *n = makeNode(VacuumStmt);

-                    n->options = NIL;
-                    if ($2)
-                        n->options = lappend(n->options,
-                                             makeDefElem("verbose", NULL, @2));
+                    n->options = $2;
                     n->rels = $3;
                     n->is_vacuumcmd = false;
                     $$ = (Node *) n;
                 }
-            | analyze_keyword '(' utility_option_list ')' 
opt_vacuum_relation_list
+            | analyze_keyword VERBOSE opt_vacuum_relation_list
                 {
                     VacuumStmt *n = makeNode(VacuumStmt);

-                    n->options = $3;
-                    n->rels = $5;
+                    n->options = list_make1(makeDefElem("verbose", NULL, @2));
+                    n->rels = $3;
                     n->is_vacuumcmd = false;
                     $$ = (Node *) n;
                 }

-- 
nathan


Reply via email to