mirror of
				https://github.com/postgres/postgres.git
				synced 2025-11-03 09:13:20 +03:00 
			
		
		
		
	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:
		@@ -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 ... */
 | 
				
			||||||
@@ -2374,8 +2386,13 @@ psql_completion(const char *text, int start, int end)
 | 
				
			|||||||
/* CREATE SUBSCRIPTION */
 | 
					/* CREATE SUBSCRIPTION */
 | 
				
			||||||
	else if (Matches3("CREATE", "SUBSCRIPTION", MatchAny))
 | 
						else if (Matches3("CREATE", "SUBSCRIPTION", MatchAny))
 | 
				
			||||||
		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
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user