On Thursday, July 22, 2021 1:05 PM, tanghy(dot)fnst(at)fujitsu(dot)com
<tanghy(dot)fnst(at)fujitsu(dot)com> wrote
I found a problem when using tab-completion as follows:
CREATE SUBSCRIPTION my_subscription
CONNECTION 'host=localhost port=5432 dbname=postgres' [TAB]
The word 'PUBLICATION' couldn't be auto completed as expected.
I too wondered about this behavior.
v3-0001-support-tab-completion-for-CONNECTION-string-with.patch
I applied the patch and succeeded in the above case, but failed in the
below case.
=# CREATE SUBSCRIPTION s1 CONNECTION 'a=' PUBLICATION p1 <tab>
Before applying the patch, 'WITH (' was completed, but now it completes
nothing since it matches the below condition:
18 + else if ((HeadMatches("CREATE", "SUBSCRIPTION", MatchAny,
"CONNECTION", MatchAny)))
19 + {
I updated the patch going along with the v3 direction.
What do you think?
--
Regards,
--
Atsushi Torikoshi
NTT DATA CORPORATION
From 0e2612a1c7762b64357c85ce04e62b5ba0cdb4f7 Mon Sep 17 00:00:00 2001
From: Atsushi Torikoshi <torikos...@oss.nttdata.com>
Date: Tue, 10 Jan 2023 09:51:30 +0900
Subject: [PATCH v4] Support tab-completion after conninfo using '='
Previously, tab-completion after CONNECTION 'conninfo' in CREATE
SUBSCRIPTION didn't work when conninfo contained '=' since conninfo
was considered multiple words.
---
src/bin/psql/t/010_tab_completion.pl | 8 ++++++++
src/bin/psql/tab-complete.c | 12 +++++++++---
2 files changed, 17 insertions(+), 3 deletions(-)
diff --git a/src/bin/psql/t/010_tab_completion.pl b/src/bin/psql/t/010_tab_completion.pl
index 7746c75e0c..4a1e8c8c32 100644
--- a/src/bin/psql/t/010_tab_completion.pl
+++ b/src/bin/psql/t/010_tab_completion.pl
@@ -288,6 +288,14 @@ check_completion(
# broken versions of libedit require clear_line not clear_query here
clear_line();
+# check tab-completion for CONNECTION string with equal sign.
+check_completion(
+ "CREATE SUBSCRIPTION my_sub CONNECTION 'host=localhost port=5432 dbname=postgres' \t",
+ qr|PUBLICATION|,
+ "tab-completion for CONNECTION string with equal sign");
+
+clear_line();
+
# COPY requires quoting
# note: broken versions of libedit want to backslash the closing quote;
# not much we can do about that
diff --git a/src/bin/psql/tab-complete.c b/src/bin/psql/tab-complete.c
index 23750ea5fb..dd66f1c7a2 100644
--- a/src/bin/psql/tab-complete.c
+++ b/src/bin/psql/tab-complete.c
@@ -3235,10 +3235,16 @@ psql_completion(const char *text, int start, int end)
/* CREATE SUBSCRIPTION */
else if (Matches("CREATE", "SUBSCRIPTION", MatchAny))
COMPLETE_WITH("CONNECTION");
- else if (Matches("CREATE", "SUBSCRIPTION", MatchAny, "CONNECTION", MatchAny))
+ /*
+ conninfo is considered as multiple words because it contains '='
+ and it makes conninfo doesn't match MatchAny.
+ Here we match conninfo noting that it ends with a single quotation.
+ */
+ else if ((HeadMatches("CREATE", "SUBSCRIPTION", MatchAny, "CONNECTION",
+ MatchAny)) && ends_with(prev_wd, '\''))
COMPLETE_WITH("PUBLICATION");
- else if (Matches("CREATE", "SUBSCRIPTION", MatchAny, "CONNECTION",
- MatchAny, "PUBLICATION"))
+ else if ((HeadMatches("CREATE", "SUBSCRIPTION", MatchAny, "CONNECTION",
+ MatchAny)) && TailMatches("PUBLICATION"))
{
/* complete with nothing here as this refers to remote publications */
}
base-commit: 57d11ef028d126f95595c08c62ffb4c5147d0f86
--
2.25.1