Re: Support tab completion for upper character inputs in psql

From: Peter Eisentraut <peter(dot)eisentraut(at)enterprisedb(dot)com>
To: "tanghy(dot)fnst(at)fujitsu(dot)com" <tanghy(dot)fnst(at)fujitsu(dot)com>, Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
Cc: Japin Li <japinli(at)hotmail(dot)com>, Kyotaro Horiguchi <horikyota(dot)ntt(at)gmail(dot)com>, Laurenz Albe <laurenz(dot)albe(at)cybertec(dot)at>, "smithpb2250(at)gmail(dot)com" <smithpb2250(at)gmail(dot)com>, "david(dot)zhang(at)highgo(dot)ca" <david(dot)zhang(at)highgo(dot)ca>, "pgsql-hackers(at)lists(dot)postgresql(dot)org" <pgsql-hackers(at)lists(dot)postgresql(dot)org>
Subject: Re: Support tab completion for upper character inputs in psql
Date: 2022-01-24 09:35:36
Message-ID: 17d022ce-2543-b4a3-2b55-fc04ae87a220@enterprisedb.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

On 20.01.22 08:37, tanghy(dot)fnst(at)fujitsu(dot)com wrote:
>> 1. The downcasing logic in the patch bears very little resemblance
>> to the backend's actual downcasing logic, which can be found in
>> src/backend/parser/scansup.c's downcase_identifier(). Notably,
>> the patch's restriction to only convert all-ASCII strings seems
>> indefensible, because that's not how things really work. I fear
>> we can't always exactly duplicate the backend's behavior, because
>> it's dependent on the server's locale and encoding; but I think
>> we should at least get it right in the common case where psql is
>> using the same locale and encoding as the server.
> Thanks for your suggestion, I removed ASCII strings check function
> and added single byte encoding check just like downcase_identifier.
> Also added PGCLIENTENCODING setting in the test script to make
> test cases pass.
> Now the patch supports tab-completion with none-quoted upper characters
> available when client encoding is in single byte.

The way your patch works now is that the case-insensitive behavior you
are implementing only works if the client encoding is a single-byte
encoding. This isn't what downcase_identifier() does;
downcase_identifier() always works for ASCII characters. As it is, this
patch is nearly useless, since very few people use single-byte client
encodings anymore. Also, I think it would be highly confusing if the
tab completion behavior depended on the client encoding in a significant
way.

Also, as I had previously suspected, your patch treats the completion of
enum labels in a case-insensitive way (since it all goes through
_complete_from_query()), but enum labels are not case insensitive. You
can observe this behavior using this test case:

+check_completion("ALTER TYPE enum1 RENAME VALUE 'F\t\t", qr|foo|, "FIXME");
+
+clear_line();

You should devise a principled way to communicate to
_complete_from_query() whether it should do case-sensitive or
-insensitive completion. We already have COMPLETE_WITH() and
COMPLETE_WITH_CS() etc. to do this in other cases, so it should be
straightforward to adapt a similar system.

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Amit Kapila 2022-01-24 09:42:58 Re: Skipping logical replication transactions on subscriber side
Previous Message Amit Kapila 2022-01-24 09:32:17 Re: row filtering for logical replication