Add tab-completion for ALTER TABLE not-nulls
authorÁlvaro Herrera <[email protected]>
Thu, 3 Jul 2025 14:54:36 +0000 (16:54 +0200)
committerÁlvaro Herrera <[email protected]>
Thu, 3 Jul 2025 14:54:36 +0000 (16:54 +0200)
The command is: ALTER TABLE x ADD [CONSTRAINT y] NOT NULL z

This syntax was added in 18, but I got pushback for getting commit
dbf42b84ac7b in 18 (also tab-completion for new syntax) after the
feature freeze, so I'll put this in master only for now.

Author: Álvaro Herrera <[email protected]>
Reported-by: Fujii Masao <[email protected]>
Reviewed-by: Fujii Masao <[email protected]>
Reviewed-by: Dagfinn Ilmari Mannsåker <[email protected]>
Discussion: https://postgr.es/m/d4f14c6b-086b-463c-b15f-01c7c9728eab@oss.nttdata.com
Discussion: https://postgr.es/m/202505111448[email protected]

src/bin/psql/tab-complete.in.c

index 8c2ea0b95870aa37aa91eacd9c5f5a483e6e7eb6..53e7d35fe98d3642e5529d6a6d8ff54e796f8459 100644 (file)
@@ -2733,17 +2733,24 @@ match_previous_words(int pattern_id,
    /* ALTER TABLE xxx ADD */
    else if (Matches("ALTER", "TABLE", MatchAny, "ADD"))
    {
-       /* make sure to keep this list and the !Matches() below in sync */
-       COMPLETE_WITH("COLUMN", "CONSTRAINT", "CHECK", "UNIQUE", "PRIMARY KEY",
-                     "EXCLUDE", "FOREIGN KEY");
+       /*
+        * make sure to keep this list and the MatchAnyExcept() below in sync
+        */
+       COMPLETE_WITH("COLUMN", "CONSTRAINT", "CHECK (", "NOT NULL", "UNIQUE",
+                     "PRIMARY KEY", "EXCLUDE", "FOREIGN KEY");
    }
    /* ALTER TABLE xxx ADD [COLUMN] yyy */
    else if (Matches("ALTER", "TABLE", MatchAny, "ADD", "COLUMN", MatchAny) ||
-            Matches("ALTER", "TABLE", MatchAny, "ADD", MatchAnyExcept("COLUMN|CONSTRAINT|CHECK|UNIQUE|PRIMARY|EXCLUDE|FOREIGN")))
+            Matches("ALTER", "TABLE", MatchAny, "ADD", MatchAnyExcept("COLUMN|CONSTRAINT|CHECK|UNIQUE|PRIMARY|NOT|EXCLUDE|FOREIGN")))
        COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_datatypes);
    /* ALTER TABLE xxx ADD CONSTRAINT yyy */
    else if (Matches("ALTER", "TABLE", MatchAny, "ADD", "CONSTRAINT", MatchAny))
-       COMPLETE_WITH("CHECK", "UNIQUE", "PRIMARY KEY", "EXCLUDE", "FOREIGN KEY");
+       COMPLETE_WITH("CHECK (", "NOT NULL", "UNIQUE", "PRIMARY KEY", "EXCLUDE", "FOREIGN KEY");
+   /* ALTER TABLE xxx ADD NOT NULL */
+   else if (Matches("ALTER", "TABLE", MatchAny, "ADD", "NOT", "NULL"))
+       COMPLETE_WITH_ATTR(prev4_wd);
+   else if (Matches("ALTER", "TABLE", MatchAny, "ADD", "CONSTRAINT", MatchAny, "NOT", "NULL"))
+       COMPLETE_WITH_ATTR(prev6_wd);
    /* ALTER TABLE xxx ADD [CONSTRAINT yyy] (PRIMARY KEY|UNIQUE) */
    else if (Matches("ALTER", "TABLE", MatchAny, "ADD", "PRIMARY", "KEY") ||
             Matches("ALTER", "TABLE", MatchAny, "ADD", "UNIQUE") ||