psql: Improve tab completion for ALTER TABLE on identity columns
authorPeter Eisentraut <peter@eisentraut.org>
Tue, 1 Nov 2022 11:07:40 +0000 (12:07 +0100)
committerPeter Eisentraut <peter@eisentraut.org>
Tue, 1 Nov 2022 11:07:40 +0000 (12:07 +0100)
- Add tab completion for ALTER SEQUENCE … START …
- Add tab completion for ALTER COLUMN … SET GENERATED …
- Add tab completion for ALTER COLUMN … SET <sequence option>
- Add tab completion for ALTER COLUMN … ADD GENERATED … AS IDENTITY

Author: Dagfinn Ilmari Mannsåker <ilmari@ilmari.org>
Reviewed-by: Matheus Alcantara <mths.dev@pm.me>
Discussion: https://www.postgresql.org/message-id/flat/87mta1jfax.fsf@wibble.ilmari.org

src/bin/psql/tab-complete.c

index a64571215b332500bb8f3b4e7015c2b7a561cd1f..4c45e4747a970267c54d0e864773552601807bed 100644 (file)
@@ -2104,7 +2104,7 @@ psql_completion(const char *text, int start, int end)
        /* ALTER SEQUENCE <name> */
        else if (Matches("ALTER", "SEQUENCE", MatchAny))
                COMPLETE_WITH("AS", "INCREMENT", "MINVALUE", "MAXVALUE", "RESTART",
-                                         "NO", "CACHE", "CYCLE", "SET", "OWNED BY",
+                                         "START", "NO", "CACHE", "CYCLE", "SET", "OWNED BY",
                                          "OWNER TO", "RENAME TO");
        /* ALTER SEQUENCE <name> AS */
        else if (TailMatches("ALTER", "SEQUENCE", MatchAny, "AS"))
@@ -2381,10 +2381,26 @@ psql_completion(const char *text, int start, int end)
        else if (Matches("ALTER", "TABLE", MatchAny, "ALTER", "COLUMN", MatchAny) ||
                         Matches("ALTER", "TABLE", MatchAny, "ALTER", MatchAny))
                COMPLETE_WITH("TYPE", "SET", "RESET", "RESTART", "ADD", "DROP");
+       /* ALTER TABLE ALTER [COLUMN] <foo> ADD */
+       else if (Matches("ALTER", "TABLE", MatchAny, "ALTER", "COLUMN", MatchAny, "ADD") ||
+                        Matches("ALTER", "TABLE", MatchAny, "ALTER", MatchAny, "ADD"))
+               COMPLETE_WITH("GENERATED");
+       /* ALTER TABLE ALTER [COLUMN] <foo> ADD GENERATED */
+       else if (Matches("ALTER", "TABLE", MatchAny, "ALTER", "COLUMN", MatchAny, "ADD", "GENERATED") ||
+                        Matches("ALTER", "TABLE", MatchAny, "ALTER", MatchAny, "ADD", "GENERATED"))
+               COMPLETE_WITH("ALWAYS", "BY DEFAULT");
+       /* ALTER TABLE ALTER [COLUMN] <foo> ADD GENERATED */
+       else if (Matches("ALTER", "TABLE", MatchAny, "ALTER", "COLUMN", MatchAny, "ADD", "GENERATED", "ALWAYS") ||
+                        Matches("ALTER", "TABLE", MatchAny, "ALTER", MatchAny, "ADD", "GENERATED", "ALWAYS") ||
+                        Matches("ALTER", "TABLE", MatchAny, "ALTER", "COLUMN", MatchAny, "ADD", "GENERATED", "BY", "DEFAULT") ||
+                        Matches("ALTER", "TABLE", MatchAny, "ALTER", MatchAny, "ADD", "GENERATED", "BY", "DEFAULT"))
+               COMPLETE_WITH("AS IDENTITY");
        /* ALTER TABLE ALTER [COLUMN] <foo> SET */
        else if (Matches("ALTER", "TABLE", MatchAny, "ALTER", "COLUMN", MatchAny, "SET") ||
                         Matches("ALTER", "TABLE", MatchAny, "ALTER", MatchAny, "SET"))
-               COMPLETE_WITH("(", "COMPRESSION", "DEFAULT", "NOT NULL", "STATISTICS", "STORAGE");
+               COMPLETE_WITH("(", "COMPRESSION", "DEFAULT", "GENERATED", "NOT NULL", "STATISTICS", "STORAGE",
+               /* a subset of ALTER SEQUENCE options */
+                                         "INCREMENT", "MINVALUE", "MAXVALUE", "START", "NO", "CACHE", "CYCLE");
        /* ALTER TABLE ALTER [COLUMN] <foo> SET ( */
        else if (Matches("ALTER", "TABLE", MatchAny, "ALTER", "COLUMN", MatchAny, "SET", "(") ||
                         Matches("ALTER", "TABLE", MatchAny, "ALTER", MatchAny, "SET", "("))
@@ -2393,6 +2409,14 @@ psql_completion(const char *text, int start, int end)
        else if (Matches("ALTER", "TABLE", MatchAny, "ALTER", "COLUMN", MatchAny, "SET", "COMPRESSION") ||
                         Matches("ALTER", "TABLE", MatchAny, "ALTER", MatchAny, "SET", "COMPRESSION"))
                COMPLETE_WITH("DEFAULT", "PGLZ", "LZ4");
+       /* ALTER TABLE ALTER [COLUMN] <foo> SET GENERATED */
+       else if (Matches("ALTER", "TABLE", MatchAny, "ALTER", "COLUMN", MatchAny, "SET", "GENERATED") ||
+                        Matches("ALTER", "TABLE", MatchAny, "ALTER", MatchAny, "SET", "GENERATED"))
+               COMPLETE_WITH("ALWAYS", "BY DEFAULT");
+       /* ALTER TABLE ALTER [COLUMN] <foo> SET NO */
+       else if (Matches("ALTER", "TABLE", MatchAny, "ALTER", "COLUMN", MatchAny, "SET", "NO") ||
+                        Matches("ALTER", "TABLE", MatchAny, "ALTER", MatchAny, "SET", "NO"))
+               COMPLETE_WITH("MINVALUE", "MAXVALUE", "CYCLE");
        /* ALTER TABLE ALTER [COLUMN] <foo> SET STORAGE */
        else if (Matches("ALTER", "TABLE", MatchAny, "ALTER", "COLUMN", MatchAny, "SET", "STORAGE") ||
                         Matches("ALTER", "TABLE", MatchAny, "ALTER", MatchAny, "SET", "STORAGE"))