Peter, where are we on this? ---------------------------------------------------------------------------
On Fri, Mar 30, 2012 at 08:16:59PM +0300, Peter Eisentraut wrote: > On fre, 2012-03-23 at 07:52 -0700, David Fetter wrote: > > On Thu, Mar 22, 2012 at 06:05:30PM -0400, Andrew Dunstan wrote: > > > On 03/22/2012 05:49 PM, Bruce Momjian wrote: > > > >Robert Haas and I are disappointed by this change. I liked the > > > >fact that I could post nice-looking SQL queries without having to > > > >use my capslock key (which I use as a second control key). Any > > > >chance of reverting this change? > > > > > > > > > > Should it be governed by a setting? > > > > Something like (upper|lower|preserve) ? > > How about this patch then? (There are actually four possible settings, > see patch.) > > diff --git i/doc/src/sgml/ref/psql-ref.sgml w/doc/src/sgml/ref/psql-ref.sgml > index b849101..be9d37d 100644 > --- i/doc/src/sgml/ref/psql-ref.sgml > +++ w/doc/src/sgml/ref/psql-ref.sgml > @@ -2652,6 +2652,22 @@ bar > </varlistentry> > > <varlistentry> > + <term><varname>COMP_KEYWORD_CASE</varname></term> > + <listitem> > + <para> > + Determines which letter case to use when completing an SQL key word. > + If set to <literal>lower</literal> or <literal>upper</literal>, the > + completed word will be in lower or upper case, respectively. If set > + to <literal>preserve-lower</literal> > + or <literal>preserve-upper</literal> (the default), the completed > word > + will be in the case of the word already entered, but words being > + completed without anything entered will be in lower or upper case, > + respectively. > + </para> > + </listitem> > + </varlistentry> > + > + <varlistentry> > <term><varname>DBNAME</varname></term> > <listitem> > <para> > diff --git i/src/bin/psql/tab-complete.c w/src/bin/psql/tab-complete.c > index 6f481bb..00d87d5 100644 > --- i/src/bin/psql/tab-complete.c > +++ w/src/bin/psql/tab-complete.c > @@ -682,7 +682,7 @@ static char **complete_from_variables(char *text, > const char *prefix, const char > *suffix); > static char *complete_from_files(const char *text, int state); > > -static char *pg_strdup_same_case(const char *s, const char *ref); > +static char *pg_strdup_keyword_case(const char *s, const char *ref); > static PGresult *exec_query(const char *query); > > static void get_previous_words(int point, char **previous_words, int nwords); > @@ -3048,7 +3048,7 @@ create_or_drop_command_generator(const char *text, int > state, bits32 excluded) > { > if ((pg_strncasecmp(name, text, string_length) == 0) && > !(words_after_create[list_index - 1].flags & excluded)) > - return pg_strdup_same_case(name, text); > + return pg_strdup_keyword_case(name, text); > } > /* if nothing matches, return NULL */ > return NULL; > @@ -3335,9 +3335,9 @@ complete_from_list(const char *text, int state) > if (completion_case_sensitive) > return pg_strdup(item); > else > - /* If case insensitive matching was requested > initially, return > - * it in the case of what was already entered. > */ > - return pg_strdup_same_case(item, text); > + /* If case insensitive matching was requested > initially, adjust > + * the case according to setting. */ > + return pg_strdup_keyword_case(item, text); > } > } > > @@ -3374,9 +3374,9 @@ complete_from_const(const char *text, int state) > if (completion_case_sensitive) > return pg_strdup(completion_charp); > else > - /* If case insensitive matching was requested > initially, return it > - * in the case of what was already entered. */ > - return pg_strdup_same_case(completion_charp, text); > + /* If case insensitive matching was requested > initially, adjust the > + * case according to setting. */ > + return pg_strdup_keyword_case(completion_charp, text); > } > else > return NULL; > @@ -3484,27 +3484,48 @@ complete_from_files(const char *text, int state) > > > /* > - * Make a pg_strdup copy of s and convert it to the same case as ref. > + * Make a pg_strdup copy of s and convert the case according to > + * COMP_KEYWORD_CASE variable, using ref as the text that was already > entered. > */ > static char * > -pg_strdup_same_case(const char *s, const char *ref) > +pg_strdup_keyword_case(const char *s, const char *ref) > { > char *ret, *p; > unsigned char first = ref[0]; > + int tocase; > + const char *varval; > + > + varval = GetVariable(pset.vars, "COMP_KEYWORD_CASE"); > + if (!varval) > + tocase = 0; > + else if (strcmp(varval, "lower") == 0) > + tocase = -2; > + else if (strcmp(varval, "preserve-lower") == 0) > + tocase = -1; > + else if (strcmp(varval, "preserve-upper") == 0) > + tocase = +1; > + else if (strcmp(varval, "upper") == 0) > + tocase = +2; > + else > + tocase = 0; > > - if (isalpha(first)) > - { > - ret = pg_strdup(s); > - if (islower(first)) > - for (p = ret; *p; p++) > - *p = pg_tolower((unsigned char) *p); > - else > - for (p = ret; *p; p++) > - *p = pg_toupper((unsigned char) *p); > - return ret; > - } > + /* default */ > + if (tocase == 0) > + tocase = +1; > + > + ret = pg_strdup(s); > + > + if (tocase == -2 > + || ((tocase == -1 || tocase == +1) && islower(first)) > + || (tocase == -1 && !isalpha(first)) > + ) > + for (p = ret; *p; p++) > + *p = pg_tolower((unsigned char) *p); > else > - return pg_strdup(s); > + for (p = ret; *p; p++) > + *p = pg_toupper((unsigned char) *p); > + > + return ret; > } > > -- Bruce Momjian <br...@momjian.us> http://momjian.us EnterpriseDB http://enterprisedb.com + It's impossible for everything to be true. + -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers