On Tue, Nov 30, 2010 at 9:15 AM, David Fetter <da...@fetter.org> wrote: >> Patch attached. If you think my changes are ok, >> please change the patch status to "Ready for Committer". > > Done :)
I have committed part of this patch. The rest is attached. I don't know that there's any problem with it, but I ran out of steam. -- Robert Haas EnterpriseDB: http://www.enterprisedb.com The Enterprise PostgreSQL Company
diff --git a/src/bin/psql/tab-complete.c b/src/bin/psql/tab-complete.c index c88d671..9c027f0 100644 --- a/src/bin/psql/tab-complete.c +++ b/src/bin/psql/tab-complete.c @@ -384,6 +384,21 @@ static const SchemaQuery Query_for_list_of_tsv = { NULL }; +static const SchemaQuery Query_for_list_of_tv = { + /* catname */ + "pg_catalog.pg_class c", + /* selcondition */ + "c.relkind IN ('r', 'v')", + /* viscondition */ + "pg_catalog.pg_table_is_visible(c.oid)", + /* namespace */ + "c.relnamespace", + /* result */ + "pg_catalog.quote_ident(c.relname)", + /* qualresult */ + NULL +}; + static const SchemaQuery Query_for_list_of_views = { /* catname */ "pg_catalog.pg_class c", @@ -681,7 +696,8 @@ psql_completion(char *text, int start, int end) *prev2_wd, *prev3_wd, *prev4_wd, - *prev5_wd; + *prev5_wd, + *prev6_wd; static const char *const sql_commands[] = { "ABORT", "ALTER", "ANALYZE", "BEGIN", "CHECKPOINT", "CLOSE", "CLUSTER", @@ -720,7 +736,7 @@ psql_completion(char *text, int start, int end) completion_info_charp2 = NULL; /* - * Scan the input line before our current position for the last five + * Scan the input line before our current position for the last six * words. According to those we'll make some smart decisions on what the * user is probably intending to type. TODO: Use strtokx() to do this. */ @@ -729,6 +745,7 @@ psql_completion(char *text, int start, int end) prev3_wd = previous_word(start, 2); prev4_wd = previous_word(start, 3); prev5_wd = previous_word(start, 4); + prev6_wd = previous_word(start, 5); /* If a backslash command was started, continue */ if (text[0] == '\\') @@ -1025,14 +1042,6 @@ psql_completion(char *text, int start, int end) COMPLETE_WITH_QUERY(Query_for_list_of_tables_for_trigger); } - /* - * If we have ALTER TRIGGER <sth> ON, then add the correct tablename - */ - else if (pg_strcasecmp(prev4_wd, "ALTER") == 0 && - pg_strcasecmp(prev3_wd, "TRIGGER") == 0 && - pg_strcasecmp(prev_wd, "ON") == 0) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables, NULL); - /* ALTER TRIGGER <name> ON <name> */ else if (pg_strcasecmp(prev4_wd, "TRIGGER") == 0 && pg_strcasecmp(prev2_wd, "ON") == 0) @@ -1644,7 +1653,7 @@ psql_completion(char *text, int start, int end) else if (pg_strcasecmp(prev4_wd, "AS") == 0 && pg_strcasecmp(prev3_wd, "ON") == 0 && pg_strcasecmp(prev_wd, "TO") == 0) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tv, NULL); /* CREATE SERVER <name> */ else if (pg_strcasecmp(prev3_wd, "CREATE") == 0 && @@ -1711,10 +1720,15 @@ psql_completion(char *text, int start, int end) COMPLETE_WITH_LIST(list_CREATETRIGGER); } /* complete CREATE TRIGGER <name> BEFORE,AFTER with an event */ - else if (pg_strcasecmp(prev4_wd, "CREATE") == 0 && + else if ((pg_strcasecmp(prev4_wd, "CREATE") == 0 && pg_strcasecmp(prev3_wd, "TRIGGER") == 0 && (pg_strcasecmp(prev_wd, "BEFORE") == 0 || - pg_strcasecmp(prev_wd, "AFTER") == 0)) + pg_strcasecmp(prev_wd, "AFTER") == 0)) || + (pg_strcasecmp(prev5_wd, "CREATE") == 0 && + pg_strcasecmp(prev4_wd, "TRIGGER") == 0 && + pg_strcasecmp(prev2_wd, "INSTEAD") == 0 && + pg_strcasecmp(prev_wd, "OF") == 0)) + { static const char *const list_CREATETRIGGER_EVENTS[] = {"INSERT", "DELETE", "UPDATE", "TRUNCATE", NULL}; @@ -1722,10 +1736,14 @@ psql_completion(char *text, int start, int end) COMPLETE_WITH_LIST(list_CREATETRIGGER_EVENTS); } /* complete CREATE TRIGGER <name> BEFORE,AFTER sth with OR,ON */ - else if (pg_strcasecmp(prev5_wd, "CREATE") == 0 && + else if ((pg_strcasecmp(prev5_wd, "CREATE") == 0 && pg_strcasecmp(prev4_wd, "TRIGGER") == 0 && (pg_strcasecmp(prev2_wd, "BEFORE") == 0 || - pg_strcasecmp(prev2_wd, "AFTER") == 0)) + pg_strcasecmp(prev2_wd, "AFTER") == 0)) || + (pg_strcasecmp(prev6_wd, "CREATE") == 0 && + pg_strcasecmp(prev5_wd, "TRIGGER") == 0 && + (pg_strcasecmp(prev3_wd, "INSTEAD") == 0 && + (pg_strcasecmp(prev2_wd, "OF") == 0)))) { static const char *const list_CREATETRIGGER2[] = {"ON", "OR", NULL}; @@ -1742,6 +1760,11 @@ psql_completion(char *text, int start, int end) pg_strcasecmp(prev3_wd, "AFTER") == 0) && pg_strcasecmp(prev_wd, "ON") == 0) COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables, NULL); + else if (pg_strcasecmp(prev6_wd, "TRIGGER") == 0 && + pg_strcasecmp(prev4_wd, "INSTEAD") == 0 && + pg_strcasecmp(prev3_wd, "OF") == 0 && + pg_strcasecmp(prev_wd, "ON") == 0) + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_views, NULL); /* complete CREATE TRIGGER ... EXECUTE with PROCEDURE */ else if (pg_strcasecmp(prev_wd, "EXECUTE") == 0) COMPLETE_WITH_CONST("PROCEDURE");
-- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers