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; }
-- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers