psql: Add tab completion for logical replication
Add tab completion for publications and subscriptions. Also, to be able to get a list of subscriptions, make pg_subscription world-readable but revoke access to subconninfo using column privileges. From: Michael Paquier <michael.paquier@gmail.com>
This commit is contained in:
parent
6da9759a03
commit
6f236e1eb8
@ -6324,9 +6324,8 @@
|
|||||||
</para>
|
</para>
|
||||||
|
|
||||||
<para>
|
<para>
|
||||||
Access to this catalog is restricted from normal users. Normal users can
|
Access to the column <structfield>subconninfo</structfield> is revoked from
|
||||||
use the view <xref linkend="pg-stat-subscription"> to get some information
|
normal users, because it could contain plain-text passwords.
|
||||||
about subscriptions.
|
|
||||||
</para>
|
</para>
|
||||||
|
|
||||||
<table>
|
<table>
|
||||||
|
@ -900,7 +900,11 @@ CREATE VIEW pg_replication_origin_status AS
|
|||||||
|
|
||||||
REVOKE ALL ON pg_replication_origin_status FROM public;
|
REVOKE ALL ON pg_replication_origin_status FROM public;
|
||||||
|
|
||||||
|
-- All columns of pg_subscription except subconninfo are readable.
|
||||||
REVOKE ALL ON pg_subscription FROM public;
|
REVOKE ALL ON pg_subscription FROM public;
|
||||||
|
GRANT SELECT (subdbid, subname, subowner, subenabled, subslotname, subpublications)
|
||||||
|
ON pg_subscription TO public;
|
||||||
|
|
||||||
|
|
||||||
--
|
--
|
||||||
-- We have a few function definitions in here, too.
|
-- We have a few function definitions in here, too.
|
||||||
|
@ -845,6 +845,18 @@ static const SchemaQuery Query_for_list_of_matviews = {
|
|||||||
" FROM pg_catalog.pg_am "\
|
" FROM pg_catalog.pg_am "\
|
||||||
" WHERE substring(pg_catalog.quote_ident(amname),1,%d)='%s'"
|
" WHERE substring(pg_catalog.quote_ident(amname),1,%d)='%s'"
|
||||||
|
|
||||||
|
#define Query_for_list_of_publications \
|
||||||
|
" SELECT pg_catalog.quote_ident(pubname) "\
|
||||||
|
" FROM pg_catalog.pg_publication "\
|
||||||
|
" WHERE substring(pg_catalog.quote_ident(pubname),1,%d)='%s'"
|
||||||
|
|
||||||
|
#define Query_for_list_of_subscriptions \
|
||||||
|
" SELECT pg_catalog.quote_ident(s.subname) "\
|
||||||
|
" FROM pg_catalog.pg_subscription s, pg_catalog.pg_database d "\
|
||||||
|
" WHERE substring(pg_catalog.quote_ident(s.subname),1,%d)='%s' "\
|
||||||
|
" AND d.datname = pg_catalog.current_database() "\
|
||||||
|
" AND s.subdbid = d.oid"
|
||||||
|
|
||||||
/* the silly-looking length condition is just to eat up the current word */
|
/* the silly-looking length condition is just to eat up the current word */
|
||||||
#define Query_for_list_of_arguments \
|
#define Query_for_list_of_arguments \
|
||||||
"SELECT pg_catalog.oidvectortypes(proargtypes)||')' "\
|
"SELECT pg_catalog.oidvectortypes(proargtypes)||')' "\
|
||||||
@ -985,13 +997,13 @@ static const pgsql_thing_t words_after_create[] = {
|
|||||||
{"OWNED", NULL, NULL, THING_NO_CREATE}, /* for DROP OWNED BY ... */
|
{"OWNED", NULL, NULL, THING_NO_CREATE}, /* for DROP OWNED BY ... */
|
||||||
{"PARSER", Query_for_list_of_ts_parsers, NULL, THING_NO_SHOW},
|
{"PARSER", Query_for_list_of_ts_parsers, NULL, THING_NO_SHOW},
|
||||||
{"POLICY", NULL, NULL},
|
{"POLICY", NULL, NULL},
|
||||||
{"PUBLICATION", NULL, NULL},
|
{"PUBLICATION", Query_for_list_of_publications},
|
||||||
{"ROLE", Query_for_list_of_roles},
|
{"ROLE", Query_for_list_of_roles},
|
||||||
{"RULE", "SELECT pg_catalog.quote_ident(rulename) FROM pg_catalog.pg_rules WHERE substring(pg_catalog.quote_ident(rulename),1,%d)='%s'"},
|
{"RULE", "SELECT pg_catalog.quote_ident(rulename) FROM pg_catalog.pg_rules WHERE substring(pg_catalog.quote_ident(rulename),1,%d)='%s'"},
|
||||||
{"SCHEMA", Query_for_list_of_schemas},
|
{"SCHEMA", Query_for_list_of_schemas},
|
||||||
{"SEQUENCE", NULL, &Query_for_list_of_sequences},
|
{"SEQUENCE", NULL, &Query_for_list_of_sequences},
|
||||||
{"SERVER", Query_for_list_of_servers},
|
{"SERVER", Query_for_list_of_servers},
|
||||||
{"SUBSCRIPTION", NULL, NULL},
|
{"SUBSCRIPTION", Query_for_list_of_subscriptions},
|
||||||
{"TABLE", NULL, &Query_for_list_of_tables},
|
{"TABLE", NULL, &Query_for_list_of_tables},
|
||||||
{"TABLESPACE", Query_for_list_of_tablespaces},
|
{"TABLESPACE", Query_for_list_of_tablespaces},
|
||||||
{"TEMP", NULL, NULL, THING_NO_DROP}, /* for CREATE TEMP TABLE ... */
|
{"TEMP", NULL, NULL, THING_NO_DROP}, /* for CREATE TEMP TABLE ... */
|
||||||
@ -2376,6 +2388,11 @@ psql_completion(const char *text, int start, int end)
|
|||||||
COMPLETE_WITH_CONST("CONNECTION");
|
COMPLETE_WITH_CONST("CONNECTION");
|
||||||
else if (Matches5("CREATE", "SUBSCRIPTION", MatchAny, "CONNECTION", MatchAny))
|
else if (Matches5("CREATE", "SUBSCRIPTION", MatchAny, "CONNECTION", MatchAny))
|
||||||
COMPLETE_WITH_CONST("PUBLICATION");
|
COMPLETE_WITH_CONST("PUBLICATION");
|
||||||
|
else if (Matches6("CREATE", "SUBSCRIPTION", MatchAny, "CONNECTION",
|
||||||
|
MatchAny, "PUBLICATION"))
|
||||||
|
{
|
||||||
|
/* complete with nothing here as this refers to remote publications */
|
||||||
|
}
|
||||||
/* Complete "CREATE SUBSCRIPTION <name> ... WITH ( <opt>" */
|
/* Complete "CREATE SUBSCRIPTION <name> ... WITH ( <opt>" */
|
||||||
else if (HeadMatches2("CREATE", "SUBSCRIPTION") && TailMatches2("WITH", "("))
|
else if (HeadMatches2("CREATE", "SUBSCRIPTION") && TailMatches2("WITH", "("))
|
||||||
COMPLETE_WITH_LIST5("ENABLED", "DISABLED", "CREATE SLOT",
|
COMPLETE_WITH_LIST5("ENABLED", "DISABLED", "CREATE SLOT",
|
||||||
|
@ -53,6 +53,6 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/* yyyymmddN */
|
/* yyyymmddN */
|
||||||
#define CATALOG_VERSION_NO 201703031
|
#define CATALOG_VERSION_NO 201703032
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -27,6 +27,8 @@
|
|||||||
* seems weird, but the replication launcher process needs to access all of
|
* seems weird, but the replication launcher process needs to access all of
|
||||||
* them to be able to start the workers, so we have to put them in a shared,
|
* them to be able to start the workers, so we have to put them in a shared,
|
||||||
* nailed catalog.
|
* nailed catalog.
|
||||||
|
*
|
||||||
|
* NOTE: When adding a column, also update system_views.sql.
|
||||||
*/
|
*/
|
||||||
CATALOG(pg_subscription,6100) BKI_SHARED_RELATION BKI_ROWTYPE_OID(6101) BKI_SCHEMA_MACRO
|
CATALOG(pg_subscription,6100) BKI_SHARED_RELATION BKI_ROWTYPE_OID(6101) BKI_SCHEMA_MACRO
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user