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

From Yugo Nagata
Subject Re: psql: tab-completion support for COPY ... TO/FROM STDIN, STDOUT, and PROGRAM
Date
Msg-id 20250926101635.dea7cec62b02d1c614103f78@sraoss.co.jp
Whole thread Raw
In response to Re: psql: tab-completion support for COPY ... TO/FROM STDIN, STDOUT, and PROGRAM  (Masahiko Sawada <sawada.mshk@gmail.com>)
List pgsql-hackers
On Thu, 25 Sep 2025 14:31:18 -0700
Masahiko Sawada <sawada.mshk@gmail.com> wrote:

> > > I fixed it to use 'generator'.
> 
> LGTM. I've pushed the 0001 patch.

Thank you!

> > > > ---
> > > > -   /* Complete COPY <sth> FROM <sth> */
> > > > -   else if (Matches("COPY|\\copy", MatchAny, "FROM", MatchAny))
> > > > +   /* Complete COPY <sth> FROM [PROGRAM] <sth> */
> > > > +   else if (Matches("COPY|\\copy", MatchAny, "FROM",
> > > > MatchAnyExcept("PROGRAM")) ||
> > > > +            Matches("COPY|\\copy", MatchAny, "FROM", "PROGRAM", MatchAny))
> > > >
> > > > I see this kind of conversion many places in the patch; convert one
> > > > condition with MatchAny into two conditions with
> > > > MatchAnyExcept("PROGRAM") and '"PROGRAM", MatchAny'. How about
> > > > simplifying it using MatchAnyN. For example,
> > > >
> > > > else if (Matches("COPY|\\copy", MatchAny, "FROM", MatchAny, MatchAnyN))
> > >
> > > We could simplify this by using MatchAnyN, but doing so would cause "WITH ("
> > > or "WHERE" to be suggested after "WITH (...)", even though that is not allowed
> > > by the syntax. This could be misleading for users, so I wonder whether it is
> > > worth adding a bit of complexity to prevent possible confusion.
> >
> > There was a mistake in the previous statement: "WHERE" appearing after "WITH (...)"
> > is actually correct. However, this also results in "WITH" being suggested after
> > "WHERE", which is not permitted by the syntax.
> 
> True. How about other places? That is, where we check the completion
> after "WITH (". For example:
> 
> -   /* Complete COPY <sth> TO filename WITH ( */
> -   else if (Matches("COPY|\\copy", MatchAny, "TO", MatchAny, "WITH", "("))
> +   /* Complete COPY <sth> TO [PROGRAM] filename WITH ( */
> +   else if (Matches("COPY|\\copy", MatchAny, "TO",
> MatchAnyExcept("PROGRAM"), "WITH", "(") ||
> +            Matches("COPY|\\copy", MatchAny, "TO", "PROGRAM",
> MatchAny, "WITH", "("))
> 
> Does it make sense to replace these two lines with the following one line?
> 
> else if (Matches("COPY|\\copy", MatchAny, "TO", MatchAny, MatchAnyN,
> "WITH", "("))

That works for other places where options are suggested after "WITH (" and
"WHERE" is suggested after "WITH (*)".

I've attached updated patches using MatchAnyN following your suggestion.

The patch 0002 was also changed to use Matches, since MathAnyN cannot be used
with HeadMatches. I don't think this is a problem, because the COPY command cannot
be nested and "COPY or "\copy" would always appear at the beginning.

Regards,
Yugo Nagata

-- 
Yugo Nagata <nagata@sraoss.co.jp>

Attachment

pgsql-hackers by date:

Previous
From: Sami Imseih
Date:
Subject: Re: Add support for entry counting in pgstats
Next
From: Michael Paquier
Date:
Subject: Re: [BUG] temporary file usage report with extended protocol and unnamed portals