psql: tab completion offers invalid COPY option values

Started by Suraj Kharage6 days ago2 messageshackers
Jump to latest
#1Suraj Kharage
suraj.kharage@enterprisedb.com

Hi,

While browsing the code, found that tab completion for two COPY option
values does not take the COPY direction into account, so it offers values
the server rejects.

1. COPY ... FROM ... WITH (FORMAT <TAB> offers json, but COPY FROM does not
support it:

=# copy t from '/dev/null' with (format json);
ERROR: COPY FORMAT JSON is not supported for COPY FROM

2. COPY ... TO ... WITH (HEADER <TAB> offers MATCH, but it is valid only
for COPY FROM:

=# copy t to '/dev/null' with (header match);
ERROR: cannot use "match" with HEADER in COPY TO

The option-name completion already distinguishes the two directions, using
Copy_from_options and Copy_to_options selected by
HeadMatches("COPY|\\copy", MatchAny, "FROM"). The value completions for
FORMAT and HEADER sit in the same block.

The attached patch applies that same HeadMatches check to the FORMAT and
HEADER rules.

--

Thanks & Regards,
Suraj kharage,

enterprisedb.com <https://www.enterprisedb.com/>

Attachments:

t254453_1
v1-0001-psql-Fix-tab-completion-of-COPY-FORMAT-and-HEADER.patchapplication/octet-stream; name=v1-0001-psql-Fix-tab-completion-of-COPY-FORMAT-and-HEADER.patchDownload+44-3
#2Chao Li
li.evan.chao@gmail.com
In reply to: Suraj Kharage (#1)
Re: psql: tab completion offers invalid COPY option values

On Oct 30, 2026, at 12:40, Suraj Kharage <suraj.kharage@enterprisedb.com> wrote:

Hi,

While browsing the code, found that tab completion for two COPY option values does not take the COPY direction into account, so it offers values the server rejects.

1. COPY ... FROM ... WITH (FORMAT <TAB> offers json, but COPY FROM does not support it:

=# copy t from '/dev/null' with (format json);
ERROR: COPY FORMAT JSON is not supported for COPY FROM

2. COPY ... TO ... WITH (HEADER <TAB> offers MATCH, but it is valid only for COPY FROM:

=# copy t to '/dev/null' with (header match);
ERROR: cannot use "match" with HEADER in COPY TO

Good catch.

The option-name completion already distinguishes the two directions, using Copy_from_options and Copy_to_options selected by HeadMatches("COPY|\\copy", MatchAny, "FROM"). The value completions for FORMAT and HEADER sit in the same block.

The attached patch applies that same HeadMatches check to the FORMAT and HEADER rules.

--

Thanks & Regards,
Suraj kharage,

enterprisedb.com
<v1-0001-psql-Fix-tab-completion-of-COPY-FORMAT-and-HEADER.patch>

V1 looks good to me. And I tested it locally, it works for me as expected.

Best regards,
--
Chao Li (Evan)
HighGo Software Co., Ltd.
https://www.highgo.com/