It is very good, but it seems to me that there are some tab-completion missing in COMMENT command. For example, - CONSTRAINT ... ON DOMAIN - OPERATOR CLASS - OPERATOR FAMILY - POLICY ... ON - [PROCEDURAL] - RULE ... ON - TRIGGER ... ONI think these tab-comletion also can be improved and it's a good timing for that.
Thank you for the comments! I fixed where you pointed out. Best wishes, Ken Kato
diff --git a/src/bin/psql/tab-complete.c b/src/bin/psql/tab-complete.c index 5cd5838668..9b3651072f 100644 --- a/src/bin/psql/tab-complete.c +++ b/src/bin/psql/tab-complete.c @@ -494,7 +494,6 @@ static const SchemaQuery Query_for_list_of_partitioned_indexes = { .result = "pg_catalog.quote_ident(c.relname)", }; - /* All relations */ static const SchemaQuery Query_for_list_of_relations = { .catname = "pg_catalog.pg_class c", @@ -513,6 +512,20 @@ static const SchemaQuery Query_for_list_of_partitioned_relations = { .result = "pg_catalog.quote_ident(c.relname)", }; +static const SchemaQuery Query_for_list_of_operators = { + .catname = "pg_catalog.pg_operator c", + .viscondition = "pg_catalog.pg_operator_is_visible(c.oid)", + .namespace = "c.oprnamespace", + .result = "pg_catalog.quote_ident(c.oprname)", +}; + +static const SchemaQuery Query_for_list_of_operator_classes = { + .catname = "pg_catalog.pg_opclass c", + .viscondition = "pg_catalog.pg_opclass_is_visible(c.oid)", + .namespace = "c.opcnamespace", + .result = "pg_catalog.quote_ident(c.opcname)", +}; + static const SchemaQuery Query_for_list_of_operator_families = { .catname = "pg_catalog.pg_opfamily c", .viscondition = "pg_catalog.pg_opfamily_is_visible(c.oid)", @@ -628,7 +641,6 @@ static const SchemaQuery Query_for_list_of_collations = { .result = "pg_catalog.quote_ident(c.collname)", }; - /* * Queries to get lists of names of various kinds of things, possibly * restricted to names matching a partially entered name. In these queries, @@ -767,6 +779,22 @@ static const SchemaQuery Query_for_list_of_collations = { " UNION ALL SELECT 'CURRENT_USER'"\ " UNION ALL SELECT 'SESSION_USER'" +#define Query_for_list_of_operator_class_index_methods \ +"SELECT pg_catalog.quote_ident(amname)"\ +" FROM pg_catalog.pg_am"\ +" WHERE (%d = pg_catalog.length('%s'))"\ +" AND oid IN "\ +" (SELECT opcmethod FROM pg_catalog.pg_opclass "\ +" WHERE pg_catalog.quote_ident(opcname)='%s')" + +#define Query_for_list_of_operator_family_index_methods \ +"SELECT pg_catalog.quote_ident(amname)"\ +" FROM pg_catalog.pg_am"\ +" WHERE (%d = pg_catalog.length('%s'))"\ +" AND oid IN "\ +" (SELECT opfmethod FROM pg_catalog.pg_opfamily "\ +" WHERE pg_catalog.quote_ident(opfname)='%s')" + /* the silly-looking length condition is just to eat up the current word */ #define Query_for_index_of_table \ "SELECT pg_catalog.quote_ident(c2.relname) "\ @@ -2399,22 +2427,18 @@ psql_completion(const char *text, int start, int end) else if (Matches("COMMENT")) COMPLETE_WITH("ON"); else if (Matches("COMMENT", "ON")) - COMPLETE_WITH("ACCESS METHOD", "CAST", "COLLATION", "CONVERSION", - "DATABASE", "EVENT TRIGGER", "EXTENSION", - "FOREIGN DATA WRAPPER", "FOREIGN TABLE", "SERVER", - "INDEX", "LANGUAGE", "POLICY", "PUBLICATION", "RULE", - "SCHEMA", "SEQUENCE", "STATISTICS", "SUBSCRIPTION", - "TABLE", "TYPE", "VIEW", "MATERIALIZED VIEW", - "COLUMN", "AGGREGATE", "FUNCTION", - "PROCEDURE", "ROUTINE", - "OPERATOR", "TRIGGER", "CONSTRAINT", "DOMAIN", - "LARGE OBJECT", "TABLESPACE", "TEXT SEARCH", "ROLE"); + COMPLETE_WITH("ACCESS METHOD", "AGGREGATE", "CAST", "COLLATION", "COLUMN", + "CONSTRAINT", "CONVERSION", "DATABASE", "DOMAIN", + "EXTENSION", "EVENT TRIGGER", "FOREIGN DATA WRAPPER", + "FOREIGN TABLE", "FUNCTION", "INDEX", "LANGUAGE", + "LARGE OBJECT", "MATERIALIZED VIEW", "OPERATOR", + "POLICY", "PROCEDURE", "PROCEDURAL", "PUBLICATION", + "ROLE", "ROUTINE", "RULE", "SCHEMA", "SEQUENCE", + "SERVER", "STATISTICS", "SUBSCRIPTION", "TABLE", + "TABLESPACE", "TEXT SEARCH", "TRANSFORM FOR", "TRIGGER", + "TYPE", "VIEW"); else if (Matches("COMMENT", "ON", "ACCESS", "METHOD")) COMPLETE_WITH_QUERY(Query_for_list_of_access_methods); - else if (Matches("COMMENT", "ON", "FOREIGN")) - COMPLETE_WITH("DATA WRAPPER", "TABLE"); - else if (Matches("COMMENT", "ON", "TEXT", "SEARCH")) - COMPLETE_WITH("CONFIGURATION", "DICTIONARY", "PARSER", "TEMPLATE"); else if (Matches("COMMENT", "ON", "CONSTRAINT")) COMPLETE_WITH_QUERY(Query_for_all_table_constraints); else if (Matches("COMMENT", "ON", "CONSTRAINT", MatchAny)) @@ -2422,15 +2446,76 @@ psql_completion(const char *text, int start, int end) else if (Matches("COMMENT", "ON", "CONSTRAINT", MatchAny, "ON")) { completion_info_charp = prev2_wd; - COMPLETE_WITH_QUERY(Query_for_list_of_tables_for_constraint); + COMPLETE_WITH_QUERY(Query_for_list_of_tables_for_constraint + " UNION SELECT 'DOMAIN'"); } - else if (Matches("COMMENT", "ON", "MATERIALIZED", "VIEW")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_matviews, NULL); + else if (Matches("COMMENT", "ON", "CONSTRAINT", MatchAny, "ON", "DOMAIN")) + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_domains, NULL); else if (Matches("COMMENT", "ON", "EVENT", "TRIGGER")) COMPLETE_WITH_QUERY(Query_for_list_of_event_triggers); + else if (Matches("COMMENT", "ON", "FOREIGN")) + COMPLETE_WITH("DATA WRAPPER", "TABLE"); + else if (Matches("COMMENT", "ON", "MATERIALIZED", "VIEW")) + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_matviews, NULL); + else if (Matches("COMMENT", "ON", "OPERATOR")) + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_operators, + "UNION SELECT 'CLASS'" + "UNION SELECT 'FAMILY'"); + else if (Matches("COMMENT", "ON", "OPERATOR", "CLASS")) + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_operator_classes, NULL); + else if (Matches("COMMENT", "ON", "OPERATOR", "CLASS", MatchAny)) + COMPLETE_WITH("USING"); + else if (Matches("COMMENT", "ON", "OPERATOR", "CLASS", MatchAny, "USING")) + { + completion_info_charp = prev2_wd; + COMPLETE_WITH_QUERY(Query_for_list_of_operator_class_index_methods); + } + else if (Matches("COMMENT", "ON", "OPERATOR", "FAMILY")) + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_operator_families, NULL); + else if (Matches("COMMENT", "ON", "OPERATOR", "FAMILY", MatchAny)) + COMPLETE_WITH("USING"); + else if (Matches("COMMENT", "ON", "OPERATOR", "FAMILY", MatchAny, "USING")) + { + completion_info_charp = prev2_wd; + COMPLETE_WITH_QUERY(Query_for_list_of_operator_family_index_methods); + } + else if (Matches("COMMENT", "ON", "POLICY", MatchAny)) + COMPLETE_WITH("ON"); + else if (Matches("COMMENT", "ON", "POLICY", MatchAny, "ON")) + { + completion_info_charp = prev2_wd; + COMPLETE_WITH_QUERY(Query_for_list_of_tables_for_policy); + } + else if (Matches("COMMENT", "ON", "PROCEDURAL")) + COMPLETE_WITH("LANGUAGE"); + else if (Matches("COMMENT", "ON", "PROCEDURAL", "LANGUAGE")) + COMPLETE_WITH_QUERY(Query_for_list_of_languages); + else if (Matches("COMMENT", "ON", "RULE", MatchAny)) + COMPLETE_WITH("ON"); + else if (Matches("COMMENT", "ON", "RULE", MatchAny, "ON")) + { + completion_info_charp = prev2_wd; + COMPLETE_WITH_QUERY(Query_for_list_of_tables_for_rule); + } + else if (Matches("COMMENT", "ON", "TEXT", "SEARCH")) + COMPLETE_WITH("CONFIGURATION", "DICTIONARY", "PARSER", "TEMPLATE"); + else if (Matches("COMMENT", "ON", "TRANSFORM", "FOR")) + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_datatypes, NULL); + else if (Matches("COMMENT", "ON", "TRANSFORM", "FOR", MatchAny)) + COMPLETE_WITH("LANGUAGE"); + else if (Matches("COMMENT", "ON", "TRANSFORM", "FOR", MatchAny, "LANGUAGE")) + COMPLETE_WITH_QUERY(Query_for_list_of_languages); + else if (Matches("COMMENT", "ON", "TRIGGER", MatchAny)) + COMPLETE_WITH("ON"); + else if (Matches("COMMENT", "ON", "TRIGGER", MatchAny, "ON")) + { + completion_info_charp = prev2_wd; + COMPLETE_WITH_QUERY(Query_for_list_of_tables_for_trigger); + } else if (Matches("COMMENT", "ON", MatchAny, MatchAnyExcept("IS")) || Matches("COMMENT", "ON", MatchAny, MatchAny, MatchAnyExcept("IS")) || - Matches("COMMENT", "ON", MatchAny, MatchAny, MatchAny, MatchAnyExcept("IS"))) + Matches("COMMENT", "ON", MatchAny, MatchAny, MatchAny, MatchAnyExcept("IS")) || + Matches("COMMENT", "ON", MatchAny, MatchAny, MatchAny, MatchAny, MatchAnyExcept("IS"))) COMPLETE_WITH("IS"); /* COPY */