Re: proposal: psql autocomplete for casting

Поиск
Список
Период
Сортировка
От Kyotaro HORIGUCHI
Тема Re: proposal: psql autocomplete for casting
Дата
Msg-id 20160304.132921.20213154.horiguchi.kyotaro@lab.ntt.co.jp
обсуждение исходный текст
Ответ на Re: proposal: psql autocomplete for casting  (Pavel Stehule <pavel.stehule@gmail.com>)
Ответы Re: proposal: psql autocomplete for casting  (Pavel Stehule <pavel.stehule@gmail.com>)
Список pgsql-hackers
At Thu, 3 Mar 2016 12:15:13 +0100, Pavel Stehule <pavel.stehule@gmail.com> wrote in
<CAFj8pRDB2PpESLxnwNDXmhvTS9VL0NMeAnUdv_hps9WzYwXLjw@mail.gmail.com>
pavel.stehule> 2016-03-03 12:06 GMT+01:00 Kyotaro HORIGUCHI <
> the requirement of space before is not good :( - It should be any different
> than operator chars. Not only space.
> 
> all other is perfect :)

Yeah, I fortunately agree with you:p

But the things are not so simple. readline can handle single
prefix characters but cannot not handle prefix strings.

The new diff adds ':' to WORD_BREAKS and adjusts related codes.
As far as I can see, colons are used only for variable prefix,
type casts and named parameter assignments in function
calls. This covers the first two and the last wouldn't be a
matter of tab-completion. This works as the following.

> =# select now()::t<tab>
> text                         trigger
> tid                          tsm_handler
> ...
> tinterval                    txid_snapshot
> =# select now()::te<tab>
> =# select now()::text 

As an inevitable side effect, this makes completion for ": :"
with types (which results in an syntax error) but I believe it
won't be a matter.

I'm quite unpleasant that the additional conditional expressions
use bare previous_words but found no good solution.

>   else if (previous_words_count >= 2 &&
>            previous_words[1][strlen(previous_words[1])-1] == ':' &&
>            TailMatches1(":"))

It is good if we could limit the candidate types by knowing the
operand type but it seems a bit complicated.

Some familiar type names won't come as candidates. They are
"int", "float", "decimal", "dec", which are known only to gram.y
but it does't seem to matter, too.

Thoughts? Opinions?

regards,

-- 
Kyotaro Horiguchi
NTT Open Source Software Center
diff --git a/src/bin/psql/tab-complete.c b/src/bin/psql/tab-complete.c
index 5f27120..ab0e858 100644
--- a/src/bin/psql/tab-complete.c
+++ b/src/bin/psql/tab-complete.c
@@ -58,7 +58,7 @@ extern char *filename_completion_function();#endif/* word break characters */
-#define WORD_BREAKS        "\t\n@$><=;|&{() "
+#define WORD_BREAKS        "\t\n@$><=;:|&{() "/* * Since readline doesn't let us pass any state through to the tab
completion
@@ -1312,15 +1312,23 @@ psql_completion(const char *text, int start, int end)    if (text[0] == '\\')
COMPLETE_WITH_LIST_CS(backslash_commands);
+    /* If current word is a typecast, handle that case */
+    else if (previous_words_count >= 2 &&
+             previous_words[1][strlen(previous_words[1])-1] == ':' &&
+             TailMatches1(":"))
+        COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_datatypes, NULL);
+    /* If current word is a variable interpolation, handle that case */
-    else if (text[0] == ':' && text[1] != ':')
-    {
-        if (text[1] == '\'')
-            matches = complete_from_variables(text, ":'", "'", true);
-        else if (text[1] == '"')
-            matches = complete_from_variables(text, ":\"", "\"", true);
+    else if ((previous_words_count < 2 ||
+              previous_words[1][strlen(previous_words[1])-1] != ':') &&
+             TailMatches1(":"))
+    {
+        if (text[0] == '\'')
+            matches = complete_from_variables(text, "'", "'", true);
+        else if (text[0] == '"')
+            matches = complete_from_variables(text, "\"", "\"", true);        else
-            matches = complete_from_variables(text, ":", "", true);
+            matches = complete_from_variables(text, "", "", true);    }    /* If no previous word, suggest one of the
basicsql commands */ 

В списке pgsql-hackers по дате отправления:

Предыдущее
От: Amit Kapila
Дата:
Сообщение: Re: RFC: replace pg_stat_activity.waiting with something more descriptive
Следующее
От: Michael Paquier
Дата:
Сообщение: Re: TAP / recovery-test fs-level backups, psql enhancements etc