On 2021-10-15 17:49, Ken Kato wrote:
2021-10-15 13:29 に Shinya Kato さんは書きました:
On 2021-10-14 14:30, katouknl wrote:
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 ... ON
I 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.
Thank you for the update!
I tried "COMMENT ON OPERATOR ...", and an operator seemed to be
complemented with double quotation marks.
However, it caused the COMMENT command to fail.
---
postgres=# COMMENT ON OPERATOR "+" (integer, integer) IS 'test_fail';
ERROR: syntax error at or near "("
LINE 1: COMMENT ON OPERATOR "+" (integer, integer) IS 'test_fail';
postgres=# COMMENT ON OPERATOR + (integer, integer) IS 'test_success';
COMMENT
---
So, I think as with \do command, you do not need to complete the
operators.
Do you think?
Thank you for the further comments!
I fixed so that it doesn't complete the operators anymore.
It only completes with CLASS and FAMILY.
Also, I updated TEXT SEARCH.
It completes object names for each one of CONFIGURATION, DICTIONARY,
PARSER, and TEMPLATE.
Thank you for update!
The patch looks good to me. I applied cosmetic changes to it.
Attached is the updated version of the patch.
Barring any objection, I will change status to Ready for Committer.
--
Regards,
--
Shinya Kato
Advanced Computing Technology Center
Research and Development Headquarters
NTT DATA CORPORATION
diff --git a/src/bin/psql/tab-complete.c b/src/bin/psql/tab-complete.c
index ecae9df8ed..4c67b6842b 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,11 +512,46 @@ static const SchemaQuery Query_for_list_of_partitioned_relations = {
.result = "pg_catalog.quote_ident(c.relname)",
};
+static const SchemaQuery Query_for_list_of_operator_classes = {
+ .catname = "pg_catalog.pg_opclass o",
+ .viscondition = "pg_catalog.pg_opclass_is_visible(o.oid)",
+ .namespace = "o.opcnamespace",
+ .result = "pg_catalog.quote_ident(o.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)",
- .namespace = "c.opfnamespace",
- .result = "pg_catalog.quote_ident(c.opfname)",
+ .catname = "pg_catalog.pg_opfamily o",
+ .viscondition = "pg_catalog.pg_opfamily_is_visible(o.oid)",
+ .namespace = "o.opfnamespace",
+ .result = "pg_catalog.quote_ident(o.opfname)",
+};
+
+static const SchemaQuery Query_for_list_of_text_search_configurations = {
+ .catname = "pg_catalog.pg_ts_config t",
+ .viscondition = "pg_catalog.pg_ts_config_is_visible(t.oid)",
+ .namespace = "t.cfgnamespace",
+ .result = "pg_catalog.quote_ident(t.cfgname)",
+};
+
+static const SchemaQuery Query_for_list_of_text_search_dictionaries = {
+ .catname = "pg_catalog.pg_ts_dict t",
+ .viscondition = "pg_catalog.pg_ts_dict_is_visible(t.oid)",
+ .namespace = "t.dictnamespace",
+ .result = "pg_catalog.quote_ident(t.dictname)",
+};
+
+static const SchemaQuery Query_for_list_of_text_search_parsers = {
+ .catname = "pg_catalog.pg_ts_parser t",
+ .viscondition = "pg_catalog.pg_ts_parser_is_visible(t.oid)",
+ .namespace = "t.prsnamespace",
+ .result = "pg_catalog.quote_ident(t.prsname)",
+};
+
+static const SchemaQuery Query_for_list_of_text_search_templates = {
+ .catname = "pg_catalog.pg_ts_template t",
+ .viscondition = "pg_catalog.pg_ts_template_is_visible(t.oid)",
+ .namespace = "t.tmplnamespace",
+ .result = "pg_catalog.quote_ident(t.tmplname)",
};
/* Relations supporting INSERT, UPDATE or DELETE */
@@ -628,7 +662,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 +800,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 +2448,19 @@ 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 +2468,89 @@ 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", "FOREIGN", "TABLE"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_foreign_tables, NULL);
+ 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("CLASS", "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"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_policies);
+ 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", "TEXT", "SEARCH", "CONFIGURATION"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_text_search_configurations, NULL);
+ else if (Matches("COMMENT", "ON", "TEXT", "SEARCH", "DICTIONARY"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_text_search_dictionaries, NULL);
+ else if (Matches("COMMENT", "ON", "TEXT", "SEARCH", "PARSER"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_text_search_parsers, NULL);
+ else if (Matches("COMMENT", "ON", "TEXT", "SEARCH", "TEMPLATE"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_text_search_templates, NULL);
+ 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"))
+ {
+ completion_info_charp = prev2_wd;
+ 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 */