Improve psql tab completion for transforms, domains and sequences
authorMichael Paquier <michael@paquier.xyz>
Fri, 19 Nov 2021 02:02:15 +0000 (11:02 +0900)
committerMichael Paquier <michael@paquier.xyz>
Fri, 19 Nov 2021 02:02:15 +0000 (11:02 +0900)
The following improvements are done:
- Addition of some tab completion for CREATE DOMAIN.
- Addition of some tab completion for CREATE TRANSFORM.
- Addition of type completion for CREATE SEQUENCE AS.

Author: Ken Kato
Reviewed-by: Kyotaro Horiguchi, Michael Paquier
Discussion: https://postgr.es/m/8d370135aef066659eef8e8fbfa6315b@oss.nttdata.com

src/bin/psql/tab-complete.c

index 4f724e4428b1de5ec58ede5f309c6237826eddaf..fa2e19593c59070d8fe699f367523f4bbd59d4f3 100644 (file)
@@ -2582,6 +2582,17 @@ psql_completion(const char *text, int start, int end)
    else if (Matches("CREATE", "DATABASE", MatchAny, "TEMPLATE"))
        COMPLETE_WITH_QUERY(Query_for_list_of_template_databases);
 
+   /* CREATE DOMAIN */
+   else if (Matches("CREATE", "DOMAIN", MatchAny))
+       COMPLETE_WITH("AS");
+   else if (Matches("CREATE", "DOMAIN", MatchAny, "AS"))
+       COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_datatypes, NULL);
+   else if (Matches("CREATE", "DOMAIN", MatchAny, "AS", MatchAny))
+       COMPLETE_WITH("COLLATE", "DEFAULT", "CONSTRAINT",
+                     "NOT NULL", "NULL", "CHECK (");
+   else if (Matches("CREATE", "DOMAIN", MatchAny, "COLLATE"))
+       COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_collations, NULL);
+
    /* CREATE EXTENSION */
    /* Complete with available extensions rather than installed ones. */
    else if (Matches("CREATE", "EXTENSION"))
@@ -2805,8 +2816,11 @@ psql_completion(const char *text, int start, int end)
 /* CREATE SEQUENCE --- is allowed inside CREATE SCHEMA, so use TailMatches */
    else if (TailMatches("CREATE", "SEQUENCE", MatchAny) ||
             TailMatches("CREATE", "TEMP|TEMPORARY", "SEQUENCE", MatchAny))
-       COMPLETE_WITH("INCREMENT BY", "MINVALUE", "MAXVALUE", "NO", "CACHE",
-                     "CYCLE", "OWNED BY", "START WITH");
+       COMPLETE_WITH("AS", "INCREMENT BY", "MINVALUE", "MAXVALUE", "NO",
+                     "CACHE", "CYCLE", "OWNED BY", "START WITH");
+   else if (TailMatches("CREATE", "SEQUENCE", MatchAny, "AS") ||
+            TailMatches("CREATE", "TEMP|TEMPORARY", "SEQUENCE", MatchAny, "AS"))
+       COMPLETE_WITH_CS("smallint", "integer", "bigint");
    else if (TailMatches("CREATE", "SEQUENCE", MatchAny, "NO") ||
             TailMatches("CREATE", "TEMP|TEMPORARY", "SEQUENCE", MatchAny, "NO"))
        COMPLETE_WITH("MINVALUE", "MAXVALUE", "CYCLE");
@@ -2882,6 +2896,23 @@ psql_completion(const char *text, int start, int end)
    else if (Matches("CREATE", "TEXT", "SEARCH", "CONFIGURATION|DICTIONARY|PARSER|TEMPLATE", MatchAny))
        COMPLETE_WITH("(");
 
+/* CREATE TRANSFORM */
+   else if (Matches("CREATE", "TRANSFORM") ||
+            Matches("CREATE", "OR", "REPLACE", "TRANSFORM"))
+       COMPLETE_WITH("FOR");
+   else if (Matches("CREATE", "TRANSFORM", "FOR") ||
+            Matches("CREATE","OR", "REPLACE", "TRANSFORM", "FOR"))
+       COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_datatypes, NULL);
+   else if (Matches("CREATE", "TRANSFORM", "FOR", MatchAny) ||
+            Matches("CREATE", "OR", "REPLACE", "TRANSFORM", "FOR", MatchAny))
+       COMPLETE_WITH("LANGUAGE");
+   else if (Matches("CREATE", "TRANSFORM", "FOR", MatchAny, "LANGUAGE") ||
+            Matches("CREATE", "OR", "REPLACE", "TRANSFORM", "FOR", MatchAny, "LANGUAGE"))
+   {
+       completion_info_charp = prev2_wd;
+       COMPLETE_WITH_QUERY(Query_for_list_of_languages);
+   }
+
 /* CREATE SUBSCRIPTION */
    else if (Matches("CREATE", "SUBSCRIPTION", MatchAny))
        COMPLETE_WITH("CONNECTION");