0001-Support-tab-completion-for-upper-character-inputs-in.patch
application/octet-stream
Filename: 0001-Support-tab-completion-for-upper-character-inputs-in.patch
Type: application/octet-stream
Part: 0
Patch
Format: format-patch
Series: patch 0001
Subject: Support tab completion for upper character inputs in psql
| File | + | − |
|---|---|---|
| src/bin/psql/tab-complete.c | 37 | 7 |
From 5e11cbdc3a3b27e9a6341f140a78892739cfcb03 Mon Sep 17 00:00:00 2001
From: Haiying Tang <tanghy.fnst@fujitsu.com>
Date: Thu, 4 Feb 2021 22:53:44 +0800
Subject: [PATCH] Support tab completion for upper character inputs in psql
diff --git a/src/bin/psql/tab-complete.c b/src/bin/psql/tab-complete.c
index eb018854a5..4c69a3bbcd 100644
--- a/src/bin/psql/tab-complete.c
+++ b/src/bin/psql/tab-complete.c
@@ -196,6 +196,7 @@ static bool completion_force_quote; /* true to force-quote filenames */
*/
#define COMPLETE_WITH_QUERY(query) \
do { \
+ completion_case_sensitive = false; \
completion_charp = query; \
matches = rl_completion_matches(text, complete_from_query); \
} while (0)
@@ -982,7 +983,7 @@ static const VersionedQuery Query_for_list_of_subscriptions[] = {
};
/*
- * This is a list of all "things" in Pgsql, which can show up after CREATE or
+ * This is a list of all "things" in pgsql, which can show up after CREATE or
* DROP; and there is also a query to get a list of them.
*/
@@ -1132,6 +1133,7 @@ static char *complete_from_files(const char *text, int state);
static char *pg_strdup_keyword_case(const char *s, const char *ref);
static char *escape_string(const char *text);
+static char *pg_string_tolower(const char *text);
static PGresult *exec_query(const char *query);
static char **get_previous_words(int point, char **buffer, int *nwords);
@@ -4147,8 +4149,10 @@ _complete_from_query(const char *simple_query,
PQclear(result);
result = NULL;
- /* Set up suitably-escaped copies of textual inputs */
- e_text = escape_string(text);
+ /* Set up suitably-escaped copies of textual inputs,
+ * then change the textual inputs to lower case.
+ */
+ e_text = pg_string_tolower(escape_string(text));
if (completion_info_charp)
e_info_charp = escape_string(completion_info_charp);
@@ -4191,7 +4195,7 @@ _complete_from_query(const char *simple_query,
*/
if (strcmp(schema_query->catname,
"pg_catalog.pg_class c") == 0 &&
- strncmp(text, "pg_", 3) != 0)
+ strncmp(pg_string_tolower(text), "pg_", 3) != 0)
{
appendPQExpBufferStr(&query_buffer,
" AND c.relnamespace <> (SELECT oid FROM"
@@ -4283,7 +4287,17 @@ _complete_from_query(const char *simple_query,
while (list_index < PQntuples(result) &&
(item = PQgetvalue(result, list_index++, 0)))
if (pg_strncasecmp(text, item, byte_length) == 0)
- return pg_strdup(item);
+ {
+ if (completion_case_sensitive)
+ return pg_strdup(item);
+ else
+ /*
+ * If case insensitive matching was requested initially,
+ * adjust the case according to setting.
+ */
+ return pg_strdup_keyword_case(item, text);
+ }
+
}
/* If nothing matches, free the db structure and return null */
@@ -4334,7 +4348,6 @@ complete_from_list(const char *text, int state)
if (completion_case_sensitive)
return pg_strdup(item);
else
-
/*
* If case insensitive matching was requested initially,
* adjust the case according to setting.
@@ -4387,7 +4400,6 @@ 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, adjust
* the case according to setting.
@@ -4620,6 +4632,24 @@ escape_string(const char *text)
}
+/*
+ * pg_string_tolower - Fold a string to lower case.
+ */
+static char *
+pg_string_tolower(const char *text)
+{
+ char *ret,
+ *p;
+
+ ret = pg_strdup(text);
+
+ for (p = ret; *p; p++)
+ *p = pg_tolower((unsigned char) *p);
+
+ return ret;
+}
+
+
/*
* Execute a query and report any errors. This should be the preferred way of
* talking to the database in this file.
--
2.30.0.windows.2