1
0
mirror of https://github.com/postgres/postgres.git synced 2025-11-09 06:21:09 +03:00

psql: Add tab completion for COPY ... PROGRAM.

This commit adds tab completion support for COPY TO PROGRAM and COPY
FROM PROGRAM syntax in psql.

Author: Yugo Nagata <nagata@sraoss.co.jp>
Reviewed-by: Masahiko Sawada <sawada.mshk@gmail.com>
Discussion: https://postgr.es/m/20250605100835.b396f9d656df1018f65a4556@sraoss.co.jp
This commit is contained in:
Masahiko Sawada
2025-11-04 10:51:39 -08:00
parent 02fd47dbfa
commit 6d2ff1de4d

View File

@@ -3336,48 +3336,61 @@ match_previous_words(int pattern_id,
/* Complete COPY <sth> */ /* Complete COPY <sth> */
else if (Matches("COPY|\\copy", MatchAny)) else if (Matches("COPY|\\copy", MatchAny))
COMPLETE_WITH("FROM", "TO"); COMPLETE_WITH("FROM", "TO");
/* Complete COPY|\copy <sth> FROM|TO with filename or STDIN/STDOUT */ /* Complete COPY|\copy <sth> FROM|TO with filename or STDIN/STDOUT/PROGRAM */
else if (Matches("COPY|\\copy", MatchAny, "FROM|TO")) else if (Matches("COPY|\\copy", MatchAny, "FROM|TO"))
{ {
/* COPY requires quoted filename */ /* COPY requires quoted filename */
bool force_quote = HeadMatches("COPY"); bool force_quote = HeadMatches("COPY");
if (TailMatches("FROM")) if (TailMatches("FROM"))
COMPLETE_WITH_FILES_PLUS("", force_quote, "STDIN"); COMPLETE_WITH_FILES_PLUS("", force_quote, "STDIN", "PROGRAM");
else else
COMPLETE_WITH_FILES_PLUS("", force_quote, "STDOUT"); COMPLETE_WITH_FILES_PLUS("", force_quote, "STDOUT", "PROGRAM");
} }
/* Complete COPY <sth> TO <sth> */ /* Complete COPY|\copy <sth> FROM|TO PROGRAM */
else if (Matches("COPY|\\copy", MatchAny, "TO", MatchAny)) else if (Matches("COPY|\\copy", MatchAny, "FROM|TO", "PROGRAM"))
COMPLETE_WITH_FILES("", HeadMatches("COPY")); /* COPY requires quoted
* filename */
/* Complete COPY <sth> TO [PROGRAM] <sth> */
else if (Matches("COPY|\\copy", MatchAny, "TO", MatchAnyExcept("PROGRAM")) ||
Matches("COPY|\\copy", MatchAny, "TO", "PROGRAM", MatchAny))
COMPLETE_WITH("WITH ("); COMPLETE_WITH("WITH (");
/* Complete COPY <sth> FROM <sth> */ /* Complete COPY <sth> FROM [PROGRAM] <sth> */
else if (Matches("COPY|\\copy", MatchAny, "FROM", MatchAny)) else if (Matches("COPY|\\copy", MatchAny, "FROM", MatchAnyExcept("PROGRAM")) ||
Matches("COPY|\\copy", MatchAny, "FROM", "PROGRAM", MatchAny))
COMPLETE_WITH("WITH (", "WHERE"); COMPLETE_WITH("WITH (", "WHERE");
/* Complete COPY <sth> FROM filename WITH ( */ /* Complete COPY <sth> FROM [PROGRAM] filename WITH ( */
else if (Matches("COPY|\\copy", MatchAny, "FROM", MatchAny, "WITH", "(")) else if (Matches("COPY|\\copy", MatchAny, "FROM", MatchAnyExcept("PROGRAM"), "WITH", "(") ||
Matches("COPY|\\copy", MatchAny, "FROM", "PROGRAM", MatchAny, "WITH", "("))
COMPLETE_WITH(Copy_from_options); COMPLETE_WITH(Copy_from_options);
/* Complete COPY <sth> TO filename WITH ( */ /* Complete COPY <sth> TO [PROGRAM] filename WITH ( */
else if (Matches("COPY|\\copy", MatchAny, "TO", MatchAny, "WITH", "(")) else if (Matches("COPY|\\copy", MatchAny, "TO", MatchAnyExcept("PROGRAM"), "WITH", "(") ||
Matches("COPY|\\copy", MatchAny, "TO", "PROGRAM", MatchAny, "WITH", "("))
COMPLETE_WITH(Copy_to_options); COMPLETE_WITH(Copy_to_options);
/* Complete COPY <sth> FROM|TO filename WITH (FORMAT */ /* Complete COPY <sth> FROM|TO [PROGRAM] <sth> WITH (FORMAT */
else if (Matches("COPY|\\copy", MatchAny, "FROM|TO", MatchAny, "WITH", "(", "FORMAT")) else if (Matches("COPY|\\copy", MatchAny, "FROM|TO", MatchAnyExcept("PROGRAM"), "WITH", "(", "FORMAT") ||
Matches("COPY|\\copy", MatchAny, "FROM|TO", "PROGRAM", MatchAny, "WITH", "(", "FORMAT"))
COMPLETE_WITH("binary", "csv", "text"); COMPLETE_WITH("binary", "csv", "text");
/* Complete COPY <sth> FROM filename WITH (ON_ERROR */ /* Complete COPY <sth> FROM [PROGRAM] filename WITH (ON_ERROR */
else if (Matches("COPY|\\copy", MatchAny, "FROM", MatchAny, "WITH", "(", "ON_ERROR")) else if (Matches("COPY|\\copy", MatchAny, "FROM", MatchAnyExcept("PROGRAM"), "WITH", "(", "ON_ERROR") ||
Matches("COPY|\\copy", MatchAny, "FROM", "PROGRAM", MatchAny, "WITH", "(", "ON_ERROR"))
COMPLETE_WITH("stop", "ignore"); COMPLETE_WITH("stop", "ignore");
/* Complete COPY <sth> FROM filename WITH (LOG_VERBOSITY */ /* Complete COPY <sth> FROM [PROGRAM] filename WITH (LOG_VERBOSITY */
else if (Matches("COPY|\\copy", MatchAny, "FROM", MatchAny, "WITH", "(", "LOG_VERBOSITY")) else if (Matches("COPY|\\copy", MatchAny, "FROM", MatchAnyExcept("PROGRAM"), "WITH", "(", "LOG_VERBOSITY") ||
Matches("COPY|\\copy", MatchAny, "FROM", "PROGRAM", MatchAny, "WITH", "(", "LOG_VERBOSITY"))
COMPLETE_WITH("silent", "default", "verbose"); COMPLETE_WITH("silent", "default", "verbose");
/* Complete COPY <sth> FROM <sth> WITH (<options>) */ /* Complete COPY <sth> FROM [PROGRAM] <sth> WITH (<options>) */
else if (Matches("COPY|\\copy", MatchAny, "FROM", MatchAny, "WITH", MatchAny)) else if (Matches("COPY|\\copy", MatchAny, "FROM", MatchAnyExcept("PROGRAM"), "WITH", MatchAny) ||
Matches("COPY|\\copy", MatchAny, "FROM", "PROGRAM", MatchAny, "WITH", MatchAny))
COMPLETE_WITH("WHERE"); COMPLETE_WITH("WHERE");
/* CREATE ACCESS METHOD */ /* CREATE ACCESS METHOD */