]> granicus.if.org Git - postgresql/commitdiff
Improve tab-completion for DROP POLICY
authorAlvaro Herrera <alvherre@alvh.no-ip.org>
Mon, 20 Jul 2015 13:37:17 +0000 (15:37 +0200)
committerAlvaro Herrera <alvherre@alvh.no-ip.org>
Mon, 20 Jul 2015 13:37:17 +0000 (15:37 +0200)
Backpatch to 9.5.

Author: Pavel StÄ›hule

src/bin/psql/tab-complete.c

index 4fd1dba6515fcc065d980571ab2ece915749c872..b2d627f471b8247c12c8cfda91598e63d3257cc4 100644 (file)
@@ -742,6 +742,19 @@ static const SchemaQuery Query_for_list_of_matviews = {
 "   FROM pg_catalog.pg_tablesample_method "\
 "  WHERE substring(pg_catalog.quote_ident(tsmname),1,%d)='%s'"
 
+#define Query_for_list_of_policies \
+" SELECT pg_catalog.quote_ident(polname) "\
+"   FROM pg_catalog.pg_policy " \
+"  WHERE substring(pg_catalog.quote_ident(polname),1,%d)='%s'"
+
+#define Query_for_list_of_tables_for_policy \
+"SELECT pg_catalog.quote_ident(relname) "\
+"  FROM pg_catalog.pg_class"\
+" WHERE (%d = pg_catalog.length('%s'))"\
+"   AND oid IN "\
+"       (SELECT polrelid FROM pg_catalog.pg_policy "\
+"         WHERE pg_catalog.quote_ident(polname)='%s')"
+
 /*
  * This is a list of all "things" in Pgsql, which can show up after CREATE or
  * DROP; and there is also a query to get a list of them.
@@ -2891,15 +2904,26 @@ psql_completion(const char *text, int start, int end)
                COMPLETE_WITH_QUERY(Query_for_list_of_event_triggers);
        }
 
+       /* DROP POLICY <name>  */
+       else if (pg_strcasecmp(prev2_wd, "DROP") == 0 &&
+                        pg_strcasecmp(prev_wd, "POLICY") == 0)
+       {
+               COMPLETE_WITH_QUERY(Query_for_list_of_policies);
+       }
        /* DROP POLICY <name> ON */
        else if (pg_strcasecmp(prev3_wd, "DROP") == 0 &&
                         pg_strcasecmp(prev2_wd, "POLICY") == 0)
+       {
                COMPLETE_WITH_CONST("ON");
+       }
        /* DROP POLICY <name> ON <table> */
        else if (pg_strcasecmp(prev4_wd, "DROP") == 0 &&
                         pg_strcasecmp(prev3_wd, "POLICY") == 0 &&
                         pg_strcasecmp(prev_wd, "ON") == 0)
-               COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables, NULL);
+       {
+               completion_info_charp = prev2_wd;
+               COMPLETE_WITH_QUERY(Query_for_list_of_tables_for_policy);
+       }
 
        /* DROP RULE */
        else if (pg_strcasecmp(prev3_wd, "DROP") == 0 &&