Re: psql: tab-completion support for COPY ... TO/FROM STDIN, STDOUT, and PROGRAM

From: Yugo Nagata <nagata(at)sraoss(dot)co(dot)jp>
To: Masahiko Sawada <sawada(dot)mshk(at)gmail(dot)com>
Cc: Pgsql Hackers <pgsql-hackers(at)postgresql(dot)org>
Subject: Re: psql: tab-completion support for COPY ... TO/FROM STDIN, STDOUT, and PROGRAM
Date: 2025-12-22 15:37:05
Message-ID: 20251223003705.1ad48b9912ca4949f3da6e8e@sraoss.co.jp
Views: Whole Thread | Raw Message | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

On Mon, 24 Nov 2025 15:32:36 -0800
Masahiko Sawada <sawada(dot)mshk(at)gmail(dot)com> wrote:

I'm sorry for the late response.

> Thank you for updating the patch! I have one question about the
> following change:
>
> + /* Complete COPY <sth> FROM|TO [PROGRAM] filename WITH ( */
> + else if (HeadMatches("COPY|\\copy", MatchAny, "FROM|TO",
> MatchAnyExcept("PROGRAM"), "WITH", "(") ||
> + HeadMatches("COPY|\\copy", MatchAny, "FROM|TO",
> "PROGRAM", MatchAny, "WITH", "("))
> + {
> + if (!HeadMatches("COPY|\\copy", MatchAny, "FROM|TO",
> MatchAnyExcept("PROGRAM"), "WITH", "(*)") &&
> + !HeadMatches("COPY|\\copy", MatchAny, "FROM|TO",
> "PROGRAM", MatchAny, "WITH", "(*)"))
> + {
>
> Given get_previous_words() treats a completed parenthesized option
> list as one word, why is the later if statement necessary? In the
> situation where the condition of the later if statement becomes false,
> the condition of the first 'else if' statement should have become
> false, no?

First of all, the condition of the outer 'else if' was wrong.
What I actually meant was:

+ /* Complete COPY <sth> FROM|TO [PROGRAM] filename WITH ( */
+ else if (HeadMatches("COPY|\\copy", MatchAny, "FROM|TO",
MatchAnyExcept("PROGRAM"), "WITH", "(*") ||
+ HeadMatches("COPY|\\copy", MatchAny, "FROM|TO",
"PROGRAM", MatchAny, "WITH", "(*"))

That is, the last word should be "(*" instead of "(".
I've attached an updated patch reflecting this fix.

This patterm is mimic how option lists are handled in the other places.
For example:

3160 else if (HeadMatches("ANALYZE", "(*") &&
3161 !HeadMatches("ANALYZE", "(*)"))

This prevents option completion after a completed paranthesized option list.
For example, after "ANALYZE (VERVOSE ON) tbl (", no ANALYZE options are suggested,
instead column names of the table "tbl" are suggested.

Similarly, this change prevents completion of COPY options after
"COPY tbl FROM stdin WITH ( FORMAT text ) WHERE (", for example.

Regards,
Yugo Nagata

--
Yugo Nagata <nagata(at)sraoss(dot)co(dot)jp>

Attachment Content-Type Size
v10-0001-psql-Improve-tab-completion-for-COPY-option-list.patch text/x-diff 4.4 KB

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message VASUKI M 2025-12-22 15:40:50 Re: [PATCH] psql: tab completion for ALTER ROLE ... IN DATABASE ...
Previous Message Matthias van de Meent 2025-12-22 15:25:43 Re: SQL-level pg_datum_image_equal