Thread
Commits
-
Fix psql's tab-completion of enum label values.
- fe75517443b7 15.0 landed
- d91d4338e054 14.2 landed
- 90a847e6dcc8 13.6 landed
-
Improve psql's tab completion for filenames.
- cd69ec66c886 13.0 cited
-
tab completion of enum values is broken
Peter Eisentraut <peter.eisentraut@enterprisedb.com> — 2022-01-13T11:23:02Z
This doesn't work anymore: create type e2 as enum ('foo', 'bar'); alter type e2 rename value 'b<TAB> This now results in alter type e2 rename value 'b' Bisecting blames commit cd69ec66c88633c09bc9a984a7f0930e09c7c96e Author: Tom Lane <tgl@sss.pgh.pa.us> Date: Thu Jan 23 11:07:12 2020 -0500 Improve psql's tab completion for filenames. which did deal with quoting of things to be completed, so it seems very plausible to be some collateral damage. The queries issued by the completion engine are bad LOG: statement: SELECT pg_catalog.quote_literal(enumlabel) FROM pg_catalog.pg_enum e, pg_catalog.pg_type t WHERE t.oid = e.enumtypid AND substring(pg_catalog.quote_literal(enumlabel),1,1)='b' AND (pg_catalog.quote_ident(typname)='e2' OR '"' || typname || '"'='e2') AND pg_catalog.pg_type_is_visible(t.oid) LIMIT 1000 good LOG: statement: SELECT pg_catalog.quote_literal(enumlabel) FROM pg_catalog.pg_enum e, pg_catalog.pg_type t WHERE t.oid = e.enumtypid AND substring(pg_catalog.quote_literal(enumlabel),1,2)='''b' AND (pg_catalog.quote_ident(typname)='e2' OR '"' || typname || '"'='e2') AND pg_catalog.pg_type_is_visible(t.oid) LIMIT 1000 I tried quickly fiddling with the substring() call to correct for the changed offset somehow, but didn't succeed. Needs more analysis. -
Re: tab completion of enum values is broken
Tom Lane <tgl@sss.pgh.pa.us> — 2022-01-13T15:39:20Z
Peter Eisentraut <peter.eisentraut@enterprisedb.com> writes: > This doesn't work anymore: > create type e2 as enum ('foo', 'bar'); > alter type e2 rename value 'b<TAB> > This now results in > alter type e2 rename value 'b' Ugh. I'll take a look. regards, tom lane -
Re: tab completion of enum values is broken
Tom Lane <tgl@sss.pgh.pa.us> — 2022-01-13T19:41:12Z
Peter Eisentraut <peter.eisentraut@enterprisedb.com> writes: > This doesn't work anymore: > create type e2 as enum ('foo', 'bar'); > alter type e2 rename value 'b<TAB> > This now results in > alter type e2 rename value 'b' The main issue here is that Query_for_list_of_enum_values[_with_schema] is designed to match against a pre-quoted list of enum values, which was appropriate when it was written because we hadn't configured Readline to do anything special with quotes. Now that we have, the string that is being supplied to match against lacks the leading quote, so that we need to remove the quote_literal() calls from those queries. A secondary problem is that if we fail to identify any match, Readline nonetheless decides to append a trailing quote. That's why you get the added quote above, and it still happens with the query fix. I'm not sure why Readline thinks it should do that. I worked around it in the attached draft patch by setting rl_completion_suppress_quote = 1 in our failure-to-match case, but that feels like using a big hammer rather than a proper solution. I'm not totally satisfied with this patch for a couple of reasons: 1. It'll allow the user to enter a non-quoted enum value, for example alter type e2 rename value b<TAB> produces alter type e2 rename value bar It's not clear to me that there's any way around that, though. I tried returning pre-quoted values as we did before (ie, changing only the WHERE clauses in the queries) but then Readline fails to match anything. We do have code to force quoting of actual filenames, but I think that's dependent on going through rl_filename_completion_function(), which of course we can't do here. 2. It doesn't seem like there's any nice way to deal with enum values that contain single quotes (which need to be doubled). Admittedly the use-case for that is probably epsilon, but it annoys me that it doesn't work. In the end, it seems like the value of this specific completion rule is not large enough to justify doing a ton of work to eliminate #1 or #2. So I propose doing the attached and calling it good. Maybe we could add a test case. Oh ... experimenting on macOS (with the system-provided libedit) shows no bug here. So I guess we'll need to make this conditional somehow, perhaps on USE_FILENAME_QUOTING_FUNCTIONS. That's another reason for not going overboard. regards, tom lane -
Re: tab completion of enum values is broken
Tom Lane <tgl@sss.pgh.pa.us> — 2022-01-14T22:48:39Z
I wrote: > Oh ... experimenting on macOS (with the system-provided libedit) > shows no bug here. So I guess we'll need to make this conditional > somehow, perhaps on USE_FILENAME_QUOTING_FUNCTIONS. That's another > reason for not going overboard. After further fooling with that, I concluded that the only workable solution is a run-time check for whether the readline library included the leading quote in what it hands us. A big advantage of doing it this way is that it mostly fixes my complaint #1: by crafting the check properly, we will include quotes if the user hits TAB without having typed anything, and we won't complete an incorrectly non-quoted identifier. There's still nothing to be done about single quotes inside an enum label, but I'm okay with blowing that case off. So I think the attached is committable. I've tried it on readline 7.0 (RHEL8) as well as whatever libedit Apple is currently shipping. regards, tom lane