From 9f3278968700129eab13884a46f1e9f2ac56a604 Mon Sep 17 00:00:00 2001
From: Kyotaro Horiguchi <horiguchi.kyotaro@lab.ntt.co.jp>
Date: Mon, 28 Nov 2016 17:45:13 +0900
Subject: [PATCH 08/12] Simplify completion for CREATE INDEX

CREATE INDEX has a rather complex syntx but removing some noise words
can simplify the completions. It also enables to use Matches instead
of TailMatches forced by a difficulty of matching. That gets rid of
the possibility of false matches.
---
 src/bin/psql/tab-complete.c | 54 +++++++++++++++++++++++++--------------------
 1 file changed, 30 insertions(+), 24 deletions(-)

diff --git a/src/bin/psql/tab-complete.c b/src/bin/psql/tab-complete.c
index 2414f47..08fe2cb 100644
--- a/src/bin/psql/tab-complete.c
+++ b/src/bin/psql/tab-complete.c
@@ -1816,53 +1816,59 @@ psql_completion_internal(const char *text, char **previous_words,
 	/* First off we complete CREATE UNIQUE with "INDEX" */
 	if (Matches2("CREATE", "UNIQUE"))
 		COMPLETE_WITH_CONST("INDEX");
+	/* Remove UNIQUE for further completion */
+	HeadMatchAndRemove3(2, 1, "CREATE", "UNIQUE", "INDEX");
 
 	/*
 	 * If we have CREATE|UNIQUE INDEX, then add "ON", "CONCURRENTLY", and
 	 * existing indexes
 	 */
-	if (Matches2("CREATE|UNIQUE", "INDEX"))
+	if (Matches2("CREATE", "INDEX"))
 		COMPLETE_WITH_SCHEMA_QUERY_KW(Query_for_list_of_indexes,
 									  ADDLIST2("ON", "CONCURRENTLY"));
-	/* Complete ... INDEX|CONCURRENTLY [<name>] ON with a list of tables  */
-	if (Matches3("INDEX|CONCURRENTLY", MatchAny, "ON") ||
-		Matches2("INDEX|CONCURRENTLY", "ON"))
-		COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tm);
+	/* Remove CONCURRENTLY for further completion */
+	HeadMatchAndRemove3(3, 1, "CREATE", "INDEX", "CONCURRENTLY");
 
 	/*
-	 * Complete CREATE|UNIQUE INDEX CONCURRENTLY with "ON" and existing
+	 * Complete CREATE [UNIQUE] INDEX [CONCURRENTLY] with "ON" and existing
 	 * indexes
 	 */
-	if (Matches3("CREATE|UNIQUE", "INDEX", "CONCURRENTLY"))
+	if (Matches2("CREATE", "INDEX"))
 		COMPLETE_WITH_SCHEMA_QUERY_KW(Query_for_list_of_indexes,
 									  ADDLIST1("ON"));
-	/* Complete CREATE|UNIQUE INDEX [CONCURRENTLY] <sth> with "ON" */
-	if (Matches3("CREATE|UNIQUE", "INDEX", MatchAny) ||
-		Matches4("CREATE|UNIQUE", "INDEX", "CONCURRENTLY", MatchAny))
+
+	/* Complete CREATE [UNIQUE] INDEX [CONCURRENTLY] <sth> with "ON" */
+	if (Matches3("CREATE", "INDEX", MatchAny))
 		COMPLETE_WITH_CONST("ON");
 
+	/* Complete CREATE INDEX [<name>] ON with a list of tables  */
+	if (Matches4("CREATE", "INDEX", MatchAny, "ON") ||
+		Matches3("CREATE", "INDEX", "ON"))
+		COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tm);
+
 	/*
 	 * Complete INDEX <name> ON <table> with a list of table columns (which
-	 * should really be in parens)
+	 * should really be in parens). Index name is still needed.
 	 */
-	if (TailMatches4("INDEX", MatchAny, "ON", MatchAny) ||
-		TailMatches3("INDEX|CONCURRENTLY", "ON", MatchAny))
+	if (Matches5("CREATE", "INDEX", MatchAny, "ON", MatchAny) ||
+		Matches4("CREATE", "INDEX", "ON", MatchAny))
 		COMPLETE_WITH_LIST2("(", "USING");
-	if (TailMatches5("INDEX", MatchAny, "ON", MatchAny, "(") ||
-		TailMatches4("INDEX|CONCURRENTLY", "ON", MatchAny, "("))
+	if (Matches6("CREATE", "INDEX", MatchAny, "ON", MatchAny, "(") ||
+		Matches5("CREATE", "INDEX", "ON", MatchAny, "("))
 		COMPLETE_WITH_ATTR(prev2_wd);
-	/* same if you put in USING */
-	if (TailMatches5("ON", MatchAny, "USING", MatchAny, "("))
-		COMPLETE_WITH_ATTR(prev4_wd);
+	/* index name is no longer necessary */
+	HeadMatchAndRemove4(3, 1, "CREATE", "INDEX", MatchAny, "ON");
+
 	/* Complete USING with an index method */
-	if (TailMatches6("INDEX", MatchAny, MatchAny, "ON", MatchAny, "USING") ||
-			 TailMatches5("INDEX", MatchAny, "ON", MatchAny, "USING") ||
-			 TailMatches4("INDEX", "ON", MatchAny, "USING"))
+	if (Matches5("CREATE", "INDEX", "ON", MatchAny, "USING"))
 		COMPLETE_WITH_QUERY(Query_for_list_of_access_methods);
-	if (TailMatches4("ON", MatchAny, "USING", MatchAny) &&
-			 !TailMatches6("POLICY", MatchAny, MatchAny, MatchAny, MatchAny, MatchAny) &&
-			 !TailMatches4("FOR", MatchAny, MatchAny, MatchAny))
+	/* Complete USING index_method with ( */
+	if (Matches6("CREATE", "INDEX", "ON", MatchAny, "USING", MatchAny))
 		COMPLETE_WITH_CONST("(");
+	/* complete using with column name */
+	if (Matches7("CREATE", "INDEX", "ON", MatchAny, "USING", MatchAny, "("))
+		COMPLETE_WITH_ATTR(prev4_wd);
+
 
 	/* CREATE POLICY */
 	/* Complete "CREATE POLICY <name> ON" */
-- 
2.9.2

