Teach SKIP_LOCKED to psql tab completion of VACUUM and ANALYZE
authorMichael Paquier <[email protected]>
Wed, 6 Mar 2019 05:42:52 +0000 (14:42 +0900)
committerMichael Paquier <[email protected]>
Wed, 6 Mar 2019 05:42:52 +0000 (14:42 +0900)
This was missing since 803b130, which has introduced the option for the
user-facing VACUUM and ANALYZE.

Author: Masahiko Sawada
Discussion: https://postgr.es/m/CAD21AoD2TMdTxRhZ7WSp940V82_OAyPmgHnbi25UbbArLgA92Q@mail.gmail.com

src/bin/psql/tab-complete.c

index 7b7a88fda34940b7065b12f3752d30a925764876..10ae21cc61376df8b075caa505b00a0e3b7e6f17 100644 (file)
@@ -2065,15 +2065,21 @@ psql_completion(const char *text, int start, int end)
 /*
  * ANALYZE [ ( option [, ...] ) ] [ table_and_columns [, ...] ]
  * ANALYZE [ VERBOSE ] [ table_and_columns [, ...] ]
- *
- * Currently the only allowed option is VERBOSE, so we can be skimpier on
- * the option processing than VACUUM has to be.
  */
        else if (Matches("ANALYZE"))
                COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_analyzables,
                                                                   " UNION SELECT 'VERBOSE'");
-       else if (Matches("ANALYZE", "("))
-               COMPLETE_WITH("VERBOSE)");
+       else if (HeadMatches("ANALYZE", "(*") &&
+                        !HeadMatches("ANALYZE", "(*)"))
+       {
+               /*
+                * This fires if we're in an unfinished parenthesized option list.
+                * get_previous_words treats a completed parenthesized option list as
+                * one word, so the above test is correct.
+                */
+               if (ends_with(prev_wd, '(') || ends_with(prev_wd, ','))
+                       COMPLETE_WITH("VERBOSE", "SKIP_LOCKED");
+       }
        else if (HeadMatches("ANALYZE") && TailMatches("("))
                /* "ANALYZE (" should be caught above, so assume we want columns */
                COMPLETE_WITH_ATTR(prev2_wd, "");
@@ -3423,7 +3429,7 @@ psql_completion(const char *text, int start, int end)
                 */
                if (ends_with(prev_wd, '(') || ends_with(prev_wd, ','))
                        COMPLETE_WITH("FULL", "FREEZE", "ANALYZE", "VERBOSE",
-                                                 "DISABLE_PAGE_SKIPPING");
+                                                 "DISABLE_PAGE_SKIPPING", "SKIP_LOCKED");
        }
        else if (HeadMatches("VACUUM") && TailMatches("("))
                /* "VACUUM (" should be caught above, so assume we want columns */