Thread

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

    Yugo Nagata <nagata@sraoss.co.jp> — 2025-12-23T01:02:17Z

    On Mon, 22 Dec 2025 14:31:51 -0800
    Masahiko Sawada <sawada.mshk@gmail.com> wrote:
    
    > On Mon, Dec 22, 2025 at 7:37 AM Yugo Nagata <nagata@sraoss.co.jp> wrote:
    > >
    > > On Mon, 24 Nov 2025 15:32:36 -0800
    > > Masahiko Sawada <sawada.mshk@gmail.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.
    > 
    > Thank you for updating the patch and the explanation!
    > 
    > I agree with these changes, so I've pushed the patch. Also, this
    > commit fest item is now marked as 'Committed'.
    
    Thank you!
    
    Regards,
    Yugo Nagata
    
    -- 
    Yugo Nagata <nagata@sraoss.co.jp>