psql: Add tab completion for VACUUM and ANALYZE ... ONLY option.
authorTom Lane <tgl@sss.pgh.pa.us>
Sun, 23 Mar 2025 21:16:08 +0000 (17:16 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Sun, 23 Mar 2025 21:16:08 +0000 (17:16 -0400)
Improve psql's tab completion for VACUUM and ANALYZE by supporting
the ONLY option introduced in 62ddf7ee9.

In passing, simplify some of the VACUUM patterns by making use
of MatchAnyN.

Author: Umar Hayat <postgresql.wizard@gmail.com>
Reviewed-by: Vignesh C <vignesh21@gmail.com>
Reviewed-by: Ilia Evdokimov <ilya.evdokimov@tantorlabs.com>
Discussion: https://postgr.es/m/CAD68Dp3L6yW_nWs+MWBs6s8tKLRzXaQdQgVRm4byZe0L-hRD8g@mail.gmail.com

src/bin/psql/tab-complete.in.c

index 9a4d993e2bc994c11539e83f8fdde2696b1e05e3..98951aef82ca3da3628d80178486816400a5312a 100644 (file)
@@ -3069,12 +3069,15 @@ match_previous_words(int pattern_id,
        COMPLETE_WITH_QUERY(Query_for_list_of_roles);
 
 /*
- * ANALYZE [ ( option [, ...] ) ] [ table_and_columns [, ...] ]
- * ANALYZE [ VERBOSE ] [ table_and_columns [, ...] ]
+ * ANALYZE [ ( option [, ...] ) ] [ [ ONLY ] table_and_columns [, ...] ]
+ * ANALYZE [ VERBOSE ] [ [ ONLY ] table_and_columns [, ...] ]
  */
    else if (Matches("ANALYZE"))
        COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_analyzables,
-                                       "VERBOSE");
+                                       "(", "VERBOSE", "ONLY");
+   else if (Matches("ANALYZE", "VERBOSE"))
+       COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_analyzables,
+                                       "ONLY");
    else if (HeadMatches("ANALYZE", "(*") &&
             !HeadMatches("ANALYZE", "(*)"))
    {
@@ -5128,30 +5131,35 @@ match_previous_words(int pattern_id,
        COMPLETE_WITH("OPTIONS");
 
 /*
- * VACUUM [ ( option [, ...] ) ] [ table_and_columns [, ...] ]
- * VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] [ ANALYZE ] [ table_and_columns [, ...] ]
+ * VACUUM [ ( option [, ...] ) ] [ [ ONLY ] table_and_columns [, ...] ]
+ * VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] [ ANALYZE ] [ [ ONLY ] table_and_columns [, ...] ]
  */
    else if (Matches("VACUUM"))
        COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_vacuumables,
+                                       "(",
                                        "FULL",
                                        "FREEZE",
+                                       "VERBOSE",
                                        "ANALYZE",
-                                       "VERBOSE");
+                                       "ONLY");
    else if (Matches("VACUUM", "FULL"))
        COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_vacuumables,
                                        "FREEZE",
+                                       "VERBOSE",
                                        "ANALYZE",
-                                       "VERBOSE");
-   else if (Matches("VACUUM", "FREEZE") ||
-            Matches("VACUUM", "FULL", "FREEZE"))
+                                       "ONLY");
+   else if (Matches("VACUUM", MatchAnyN, "FREEZE"))
        COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_vacuumables,
                                        "VERBOSE",
-                                       "ANALYZE");
-   else if (Matches("VACUUM", "VERBOSE") ||
-            Matches("VACUUM", "FULL|FREEZE", "VERBOSE") ||
-            Matches("VACUUM", "FULL", "FREEZE", "VERBOSE"))
+                                       "ANALYZE",
+                                       "ONLY");
+   else if (Matches("VACUUM", MatchAnyN, "VERBOSE"))
        COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_vacuumables,
-                                       "ANALYZE");
+                                       "ANALYZE",
+                                       "ONLY");
+   else if (Matches("VACUUM", MatchAnyN, "ANALYZE"))
+       COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_vacuumables,
+                                       "ONLY");
    else if (HeadMatches("VACUUM", "(*") &&
             !HeadMatches("VACUUM", "(*)"))
    {