From c5c808f9b30b098421ad9f255954c4b16d121ab4 Mon Sep 17 00:00:00 2001 From: Masahiko Sawada Date: Wed, 24 Dec 2025 13:55:29 -0800 Subject: [PATCH] psql: Fix tab completion for VACUUM option values. Commit 8a3e4011 introduced tab completion for the ONLY option of VACUUM and ANALYZE, along with some code simplification using MatchAnyN. However, it caused a regression in tab completion for VACUUM option values. For example, neither ON nor OFF was suggested after "VACUUM (VERBOSE". In addition, the ONLY keyword was not suggested immediately after a completed option list. Backpatch to v18. Author: Yugo Nagata Discussion: https://postgr.es/m/20251223021509.19bba68ecbbc70c9f983c2b4@sraoss.co.jp Backpatch-through: 18 --- src/bin/psql/tab-complete.in.c | 42 +++++++++++++++++++--------------- 1 file changed, 24 insertions(+), 18 deletions(-) diff --git a/src/bin/psql/tab-complete.in.c b/src/bin/psql/tab-complete.in.c index ab2712216b5..75a101c6ab5 100644 --- a/src/bin/psql/tab-complete.in.c +++ b/src/bin/psql/tab-complete.in.c @@ -3170,6 +3170,9 @@ match_previous_words(int pattern_id, else if (TailMatches("VERBOSE|SKIP_LOCKED")) COMPLETE_WITH("ON", "OFF"); } + else if (Matches("ANALYZE", "(*)")) + COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_analyzables, + "ONLY"); else if (Matches("ANALYZE", MatchAnyN, "(")) /* "ANALYZE (" should be caught above, so assume we want columns */ COMPLETE_WITH_ATTR(prev2_wd); @@ -5303,24 +5306,6 @@ match_previous_words(int pattern_id, "VERBOSE", "ANALYZE", "ONLY"); - else if (Matches("VACUUM", "FULL")) - COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_vacuumables, - "FREEZE", - "VERBOSE", - "ANALYZE", - "ONLY"); - else if (Matches("VACUUM", MatchAnyN, "FREEZE")) - COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_vacuumables, - "VERBOSE", - "ANALYZE", - "ONLY"); - else if (Matches("VACUUM", MatchAnyN, "VERBOSE")) - COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_vacuumables, - "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", "(*)")) { @@ -5340,6 +5325,27 @@ match_previous_words(int pattern_id, else if (TailMatches("INDEX_CLEANUP")) COMPLETE_WITH("AUTO", "ON", "OFF"); } + else if (Matches("VACUUM", "(*)")) + COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_vacuumables, + "ONLY"); + else if (Matches("VACUUM", "FULL")) + COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_vacuumables, + "FREEZE", + "VERBOSE", + "ANALYZE", + "ONLY"); + else if (Matches("VACUUM", MatchAnyN, "FREEZE")) + COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_vacuumables, + "VERBOSE", + "ANALYZE", + "ONLY"); + else if (Matches("VACUUM", MatchAnyN, "VERBOSE")) + COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_vacuumables, + "ANALYZE", + "ONLY"); + else if (Matches("VACUUM", MatchAnyN, "ANALYZE")) + COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_vacuumables, + "ONLY"); else if (Matches("VACUUM", MatchAnyN, "(")) /* "VACUUM (" should be caught above, so assume we want columns */ COMPLETE_WITH_ATTR(prev2_wd); -- 2.39.5