psql: fix variable existence tab completion
authorAlexander Korotkov <akorotkov@postgresql.org>
Sat, 16 Mar 2024 21:49:10 +0000 (23:49 +0200)
committerAlexander Korotkov <akorotkov@postgresql.org>
Sat, 16 Mar 2024 21:49:10 +0000 (23:49 +0200)
psql has the :{?name} syntax for testing for a psql variable existence.  This
commit implements a tab completion for this syntax.  Notably, in order to
implement this we have to remove '{' from WORD_BREAKS.  It appears that
'{' here from the very beginning and it comes from the default value of
rl_basic_word_break_characters.  And :{?name} is the only psql syntax using
the '{' sign.  So, removing it from WORD_BREAKS shouldn't break anything.

Discussion: https://postgr.es/m/CAGRrpzZU48F2oV3d8eDLr%3D4TU9xFH5Jt9ED%2BqU1%2BX91gMH68Sw%40mail.gmail.com
Author: Steve Chavez
Reviewed-by: Erik Wienhold
src/bin/psql/t/010_tab_completion.pl
src/bin/psql/tab-complete.c

index b6575b075e89d1f5e75cdce2b988e5364dfd2d9c..b45c39f0f5249249b4dfbdf6d513eda8f8dd7156 100644 (file)
@@ -413,6 +413,14 @@ check_completion(
 
 clear_query();
 
+# check completion for psql variable test
+check_completion(
+   "\\echo :{?VERB\t",
+   qr/:\{\?VERBOSITY} /,
+   "complete a psql variable test");
+
+clear_query();
+
 # check no-completions code path
 check_completion("blarg \t\t", qr//, "check completion failure path");
 
index 19db069ee94c244c0800c3580ff5b196835a65db..56d723de8a233fb09de0ac1bc0583bc31467357d 100644 (file)
@@ -76,7 +76,7 @@
 #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
@@ -1786,6 +1786,8 @@ psql_completion(const char *text, int start, int end)
            matches = complete_from_variables(text, ":'", "'", true);
        else if (text[1] == '"')
            matches = complete_from_variables(text, ":\"", "\"", true);
+       else if (text[1] == '{' && text[2] == '?')
+           matches = complete_from_variables(text, ":{?", "}", true);
        else
            matches = complete_from_variables(text, ":", "", true);
    }