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 <nagata@sraoss.co.jp>
Discussion: https://postgr.es/m/20251223021509.19bba68ecbbc70c9f983c2b4@sraoss.co.jp
Backpatch-through: 18
This commit is contained in:
Masahiko Sawada
2025-12-24 13:55:29 -08:00
parent 41808377fe
commit c5c808f9b3

View File

@@ -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);