Tab completion: don't offer valid constraints in VALIDATE CONSTRAINT.
authorTom Lane
Mon, 3 Jan 2022 23:14:01 +0000 (18:14 -0500)
committerTom Lane
Mon, 3 Jan 2022 23:14:01 +0000 (18:14 -0500)
Improve psql so that "ALTER TABLE foo VALIDATE CONSTRAINT "
only offers not-convalidated entries.  While it's not formally
wrong to offer validated ones, there's not much point either,
and it can save some typing if we incorporate this knowledge.

David Fetter, reviewed by Aleksander Alekseev

Discussion: https://postgr.es/m/20210427002433[email protected]

src/bin/psql/tab-complete.c

index cf30239f6dbc7c02e22bd664af191d0c822c368c..b81a04c93b5d6e1a95e6006e3d461fea3620c106 100644 (file)
@@ -788,6 +788,15 @@ Query_for_index_of_table \
 "       and pg_catalog.quote_ident(c1.relname)='%s'"\
 "       and pg_catalog.pg_table_is_visible(c1.oid)"
 
+/* the silly-looking length condition is just to eat up the current word */
+#define Query_for_constraint_of_table_not_validated \
+"SELECT pg_catalog.quote_ident(conname) "\
+"  FROM pg_catalog.pg_class c1, pg_catalog.pg_constraint con "\
+" WHERE c1.oid=conrelid and (%d = pg_catalog.length('%s'))"\
+"       and pg_catalog.quote_ident(c1.relname)='%s'"\
+"       and pg_catalog.pg_table_is_visible(c1.oid)" \
+"       and not con.convalidated"
+
 #define Query_for_all_table_constraints \
 "SELECT pg_catalog.quote_ident(conname) "\
 "  FROM pg_catalog.pg_constraint c "\
@@ -2165,16 +2174,18 @@ psql_completion(const char *text, int start, int end)
    /* If we have ALTER TABLE  DROP COLUMN, provide list of columns */
    else if (Matches("ALTER", "TABLE", MatchAny, "DROP", "COLUMN"))
        COMPLETE_WITH_ATTR(prev3_wd, "");
-
-   /*
-    * If we have ALTER TABLE  ALTER|DROP|RENAME|VALIDATE CONSTRAINT,
-    * provide list of constraints
-    */
-   else if (Matches("ALTER", "TABLE", MatchAny, "ALTER|DROP|RENAME|VALIDATE", "CONSTRAINT"))
+   /* ALTER TABLE  ALTER|DROP|RENAME CONSTRAINT  */
+   else if (Matches("ALTER", "TABLE", MatchAny, "ALTER|DROP|RENAME", "CONSTRAINT"))
    {
        completion_info_charp = prev3_wd;
        COMPLETE_WITH_QUERY(Query_for_constraint_of_table);
    }
+   /* ALTER TABLE  VALIDATE CONSTRAINT  */
+   else if (Matches("ALTER", "TABLE", MatchAny, "VALIDATE", "CONSTRAINT"))
+   {
+       completion_info_charp = prev3_wd;
+       COMPLETE_WITH_QUERY(Query_for_constraint_of_table_not_validated);
+   }
    /* ALTER TABLE ALTER [COLUMN]  */
    else if (Matches("ALTER", "TABLE", MatchAny, "ALTER", "COLUMN", MatchAny) ||
             Matches("ALTER", "TABLE", MatchAny, "ALTER", MatchAny))