mirror of
https://github.com/postgres/postgres.git
synced 2025-06-29 10:41:53 +03:00
psql: add \dconfig command to show server's configuration parameters.
Plain \dconfig is basically equivalent to SHOW except that you can give it a pattern with wildcards, either to match multiple GUCs or because you don't exactly remember the name you want. \dconfig+ adds type, context, and access-privilege information, mainly because every other kind of object privilege has a psql command to show it, so GUC privileges should too. (A form of this command was in some versions of the patch series leading up to commita0ffa885e
. We pulled it out then because of doubts that the design and code were up to snuff, but I think subsequent work has resolved that.) In passing, fix incorrect completion of GUC names in GRANT/REVOKE ON PARAMETER:a0ffa885e
neglected to use the VERBATIM form of COMPLETE_WITH_QUERY, so it misbehaved for custom (qualified) GUC names. Mark Dilger and Tom Lane Discussion: https://postgr.es/m/3118455.1649267333@sss.pgh.pa.us
This commit is contained in:
@ -2205,7 +2205,7 @@ REVOKE ALL ON accounts FROM PUBLIC;
|
|||||||
<entry><literal>PARAMETER</literal></entry>
|
<entry><literal>PARAMETER</literal></entry>
|
||||||
<entry><literal>sA</literal></entry>
|
<entry><literal>sA</literal></entry>
|
||||||
<entry>none</entry>
|
<entry>none</entry>
|
||||||
<entry>none</entry>
|
<entry><literal>\dconfig+</literal></entry>
|
||||||
</row>
|
</row>
|
||||||
<row>
|
<row>
|
||||||
<entry><literal>SCHEMA</literal></entry>
|
<entry><literal>SCHEMA</literal></entry>
|
||||||
|
@ -1380,6 +1380,23 @@ testdb=>
|
|||||||
</varlistentry>
|
</varlistentry>
|
||||||
|
|
||||||
|
|
||||||
|
<varlistentry>
|
||||||
|
<term><literal>\dconfig[+] [ <link linkend="app-psql-patterns"><replaceable class="parameter">pattern</replaceable></link> ]</literal></term>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Lists server configuration parameters and their values.
|
||||||
|
If <replaceable class="parameter">pattern</replaceable>
|
||||||
|
is specified, only parameters whose names match the pattern are
|
||||||
|
listed.
|
||||||
|
If <literal>+</literal> is appended to the command name, each
|
||||||
|
parameter is listed with its data type, context in which the
|
||||||
|
parameter can be set, and access privileges (if non-default access
|
||||||
|
privileges have been granted).
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
|
|
||||||
<varlistentry>
|
<varlistentry>
|
||||||
<term><literal>\dC[+] [ <link linkend="app-psql-patterns"><replaceable class="parameter">pattern</replaceable></link> ]</literal></term>
|
<term><literal>\dC[+] [ <link linkend="app-psql-patterns"><replaceable class="parameter">pattern</replaceable></link> ]</literal></term>
|
||||||
<listitem>
|
<listitem>
|
||||||
|
@ -780,7 +780,14 @@ exec_command_d(PsqlScanState scan_state, bool active_branch, const char *cmd)
|
|||||||
success = describeTablespaces(pattern, show_verbose);
|
success = describeTablespaces(pattern, show_verbose);
|
||||||
break;
|
break;
|
||||||
case 'c':
|
case 'c':
|
||||||
success = listConversions(pattern, show_verbose, show_system);
|
if (strncmp(cmd, "dconfig", 7) == 0)
|
||||||
|
success = describeConfigurationParameters(pattern,
|
||||||
|
show_verbose,
|
||||||
|
show_system);
|
||||||
|
else
|
||||||
|
success = listConversions(pattern,
|
||||||
|
show_verbose,
|
||||||
|
show_system);
|
||||||
break;
|
break;
|
||||||
case 'C':
|
case 'C':
|
||||||
success = listCasts(pattern, show_verbose);
|
success = listCasts(pattern, show_verbose);
|
||||||
|
@ -4364,6 +4364,68 @@ listConversions(const char *pattern, bool verbose, bool showSystem)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* \dconfig
|
||||||
|
*
|
||||||
|
* Describes configuration parameters.
|
||||||
|
*/
|
||||||
|
bool
|
||||||
|
describeConfigurationParameters(const char *pattern, bool verbose,
|
||||||
|
bool showSystem)
|
||||||
|
{
|
||||||
|
PQExpBufferData buf;
|
||||||
|
PGresult *res;
|
||||||
|
printQueryOpt myopt = pset.popt;
|
||||||
|
|
||||||
|
initPQExpBuffer(&buf);
|
||||||
|
printfPQExpBuffer(&buf,
|
||||||
|
"SELECT s.name AS \"%s\", "
|
||||||
|
"pg_catalog.current_setting(s.name) AS \"%s\"",
|
||||||
|
gettext_noop("Parameter"),
|
||||||
|
gettext_noop("Value"));
|
||||||
|
|
||||||
|
if (verbose)
|
||||||
|
{
|
||||||
|
appendPQExpBuffer(&buf,
|
||||||
|
", s.vartype AS \"%s\", s.context AS \"%s\", ",
|
||||||
|
gettext_noop("Type"),
|
||||||
|
gettext_noop("Context"));
|
||||||
|
if (pset.sversion >= 150000)
|
||||||
|
printACLColumn(&buf, "p.paracl");
|
||||||
|
else
|
||||||
|
appendPQExpBuffer(&buf, "NULL AS \"%s\"",
|
||||||
|
gettext_noop("Access privileges"));
|
||||||
|
}
|
||||||
|
|
||||||
|
appendPQExpBufferStr(&buf, "\nFROM pg_catalog.pg_settings s\n");
|
||||||
|
|
||||||
|
if (verbose && pset.sversion >= 150000)
|
||||||
|
appendPQExpBufferStr(&buf,
|
||||||
|
" LEFT JOIN pg_catalog.pg_parameter_acl p\n"
|
||||||
|
" ON pg_catalog.lower(s.name) = p.parname\n");
|
||||||
|
|
||||||
|
processSQLNamePattern(pset.db, &buf, pattern,
|
||||||
|
false, false,
|
||||||
|
NULL, "pg_catalog.lower(s.name)", NULL,
|
||||||
|
NULL);
|
||||||
|
|
||||||
|
appendPQExpBufferStr(&buf, "ORDER BY 1;");
|
||||||
|
|
||||||
|
res = PSQLexec(buf.data);
|
||||||
|
termPQExpBuffer(&buf);
|
||||||
|
if (!res)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
myopt.nullPrint = NULL;
|
||||||
|
myopt.title = _("List of configuration parameters");
|
||||||
|
myopt.translate_header = true;
|
||||||
|
|
||||||
|
printQuery(res, &myopt, pset.queryFout, false, pset.logfile);
|
||||||
|
|
||||||
|
PQclear(res);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* \dy
|
* \dy
|
||||||
*
|
*
|
||||||
|
@ -76,6 +76,10 @@ extern bool listDomains(const char *pattern, bool verbose, bool showSystem);
|
|||||||
/* \dc */
|
/* \dc */
|
||||||
extern bool listConversions(const char *pattern, bool verbose, bool showSystem);
|
extern bool listConversions(const char *pattern, bool verbose, bool showSystem);
|
||||||
|
|
||||||
|
/* \dconfig */
|
||||||
|
extern bool describeConfigurationParameters(const char *pattern, bool verbose,
|
||||||
|
bool showSystem);
|
||||||
|
|
||||||
/* \dC */
|
/* \dC */
|
||||||
extern bool listCasts(const char *pattern, bool verbose);
|
extern bool listCasts(const char *pattern, bool verbose);
|
||||||
|
|
||||||
|
@ -166,7 +166,7 @@ slashUsage(unsigned short int pager)
|
|||||||
* Use "psql --help=commands | wc" to count correctly. It's okay to count
|
* Use "psql --help=commands | wc" to count correctly. It's okay to count
|
||||||
* the USE_READLINE line even in builds without that.
|
* the USE_READLINE line even in builds without that.
|
||||||
*/
|
*/
|
||||||
output = PageOutput(137, pager ? &(pset.popt.topt) : NULL);
|
output = PageOutput(138, pager ? &(pset.popt.topt) : NULL);
|
||||||
|
|
||||||
fprintf(output, _("General\n"));
|
fprintf(output, _("General\n"));
|
||||||
fprintf(output, _(" \\copyright show PostgreSQL usage and distribution terms\n"));
|
fprintf(output, _(" \\copyright show PostgreSQL usage and distribution terms\n"));
|
||||||
@ -231,6 +231,7 @@ slashUsage(unsigned short int pager)
|
|||||||
fprintf(output, _(" \\dAp[+] [AMPTRN [OPFPTRN]] list support functions of operator families\n"));
|
fprintf(output, _(" \\dAp[+] [AMPTRN [OPFPTRN]] list support functions of operator families\n"));
|
||||||
fprintf(output, _(" \\db[+] [PATTERN] list tablespaces\n"));
|
fprintf(output, _(" \\db[+] [PATTERN] list tablespaces\n"));
|
||||||
fprintf(output, _(" \\dc[S+] [PATTERN] list conversions\n"));
|
fprintf(output, _(" \\dc[S+] [PATTERN] list conversions\n"));
|
||||||
|
fprintf(output, _(" \\dconfig[+] [PATTERN] list configuration parameters\n"));
|
||||||
fprintf(output, _(" \\dC[+] [PATTERN] list casts\n"));
|
fprintf(output, _(" \\dC[+] [PATTERN] list casts\n"));
|
||||||
fprintf(output, _(" \\dd[S] [PATTERN] show object descriptions not displayed elsewhere\n"));
|
fprintf(output, _(" \\dd[S] [PATTERN] show object descriptions not displayed elsewhere\n"));
|
||||||
fprintf(output, _(" \\dD[S+] [PATTERN] list domains\n"));
|
fprintf(output, _(" \\dD[S+] [PATTERN] list domains\n"));
|
||||||
|
@ -1004,6 +1004,7 @@ static const SchemaQuery Query_for_trigger_of_table = {
|
|||||||
"SELECT nspname FROM pg_catalog.pg_namespace "\
|
"SELECT nspname FROM pg_catalog.pg_namespace "\
|
||||||
" WHERE nspname LIKE '%s'"
|
" WHERE nspname LIKE '%s'"
|
||||||
|
|
||||||
|
/* Use COMPLETE_WITH_QUERY_VERBATIM with these queries for GUC names: */
|
||||||
#define Query_for_list_of_alter_system_set_vars \
|
#define Query_for_list_of_alter_system_set_vars \
|
||||||
"SELECT name FROM "\
|
"SELECT name FROM "\
|
||||||
" (SELECT pg_catalog.lower(name) AS name FROM pg_catalog.pg_settings "\
|
" (SELECT pg_catalog.lower(name) AS name FROM pg_catalog.pg_settings "\
|
||||||
@ -1690,7 +1691,7 @@ psql_completion(const char *text, int start, int end)
|
|||||||
"\\connect", "\\conninfo", "\\C", "\\cd", "\\copy",
|
"\\connect", "\\conninfo", "\\C", "\\cd", "\\copy",
|
||||||
"\\copyright", "\\crosstabview",
|
"\\copyright", "\\crosstabview",
|
||||||
"\\d", "\\da", "\\dA", "\\dAc", "\\dAf", "\\dAo", "\\dAp",
|
"\\d", "\\da", "\\dA", "\\dAc", "\\dAf", "\\dAo", "\\dAp",
|
||||||
"\\db", "\\dc", "\\dC", "\\dd", "\\ddp", "\\dD",
|
"\\db", "\\dc", "\\dconfig", "\\dC", "\\dd", "\\ddp", "\\dD",
|
||||||
"\\des", "\\det", "\\deu", "\\dew", "\\dE", "\\df",
|
"\\des", "\\det", "\\deu", "\\dew", "\\dE", "\\df",
|
||||||
"\\dF", "\\dFd", "\\dFp", "\\dFt", "\\dg", "\\di", "\\dl", "\\dL",
|
"\\dF", "\\dFd", "\\dFp", "\\dFt", "\\dg", "\\di", "\\dl", "\\dL",
|
||||||
"\\dm", "\\dn", "\\do", "\\dO", "\\dp", "\\dP", "\\dPi", "\\dPt",
|
"\\dm", "\\dn", "\\do", "\\dO", "\\dp", "\\dP", "\\dPi", "\\dPt",
|
||||||
@ -3780,7 +3781,7 @@ psql_completion(const char *text, int start, int end)
|
|||||||
TailMatches("GRANT|REVOKE", MatchAny, MatchAny, "ON", "PARAMETER") ||
|
TailMatches("GRANT|REVOKE", MatchAny, MatchAny, "ON", "PARAMETER") ||
|
||||||
TailMatches("REVOKE", "GRANT", "OPTION", "FOR", MatchAny, "ON", "PARAMETER") ||
|
TailMatches("REVOKE", "GRANT", "OPTION", "FOR", MatchAny, "ON", "PARAMETER") ||
|
||||||
TailMatches("REVOKE", "GRANT", "OPTION", "FOR", MatchAny, MatchAny, "ON", "PARAMETER"))
|
TailMatches("REVOKE", "GRANT", "OPTION", "FOR", MatchAny, MatchAny, "ON", "PARAMETER"))
|
||||||
COMPLETE_WITH_QUERY(Query_for_list_of_alter_system_set_vars);
|
COMPLETE_WITH_QUERY_VERBATIM(Query_for_list_of_alter_system_set_vars);
|
||||||
|
|
||||||
else if (TailMatches("GRANT", MatchAny, "ON", "PARAMETER", MatchAny) ||
|
else if (TailMatches("GRANT", MatchAny, "ON", "PARAMETER", MatchAny) ||
|
||||||
TailMatches("GRANT", MatchAny, MatchAny, "ON", "PARAMETER", MatchAny))
|
TailMatches("GRANT", MatchAny, MatchAny, "ON", "PARAMETER", MatchAny))
|
||||||
@ -4532,6 +4533,8 @@ psql_completion(const char *text, int start, int end)
|
|||||||
COMPLETE_WITH_QUERY(Query_for_list_of_access_methods);
|
COMPLETE_WITH_QUERY(Query_for_list_of_access_methods);
|
||||||
else if (TailMatchesCS("\\db*"))
|
else if (TailMatchesCS("\\db*"))
|
||||||
COMPLETE_WITH_QUERY(Query_for_list_of_tablespaces);
|
COMPLETE_WITH_QUERY(Query_for_list_of_tablespaces);
|
||||||
|
else if (TailMatchesCS("\\dconfig*"))
|
||||||
|
COMPLETE_WITH_QUERY_VERBATIM(Query_for_list_of_show_vars);
|
||||||
else if (TailMatchesCS("\\dD*"))
|
else if (TailMatchesCS("\\dD*"))
|
||||||
COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_domains);
|
COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_domains);
|
||||||
else if (TailMatchesCS("\\des*"))
|
else if (TailMatchesCS("\\des*"))
|
||||||
|
@ -918,8 +918,12 @@ processSQLNamePattern(PGconn *conn, PQExpBuffer buf, const char *pattern,
|
|||||||
* Convert shell-style 'pattern' into the regular expression(s) we want to
|
* Convert shell-style 'pattern' into the regular expression(s) we want to
|
||||||
* execute. Quoting/escaping into SQL literal format will be done below
|
* execute. Quoting/escaping into SQL literal format will be done below
|
||||||
* using appendStringLiteralConn().
|
* using appendStringLiteralConn().
|
||||||
|
*
|
||||||
|
* If the caller provided a schemavar, we want to split the pattern on
|
||||||
|
* ".", otherwise not.
|
||||||
*/
|
*/
|
||||||
patternToSQLRegex(PQclientEncoding(conn), NULL, &schemabuf, &namebuf,
|
patternToSQLRegex(PQclientEncoding(conn), NULL,
|
||||||
|
(schemavar ? &schemabuf : NULL), &namebuf,
|
||||||
pattern, force_escape);
|
pattern, force_escape);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -5090,6 +5090,23 @@ List of access methods
|
|||||||
hash | uuid_ops | uuid | uuid | 2 | uuid_hash_extended
|
hash | uuid_ops | uuid | uuid | 2 | uuid_hash_extended
|
||||||
(5 rows)
|
(5 rows)
|
||||||
|
|
||||||
|
-- check \dconfig
|
||||||
|
set work_mem = 10240;
|
||||||
|
\dconfig work_mem
|
||||||
|
List of configuration parameters
|
||||||
|
Parameter | Value
|
||||||
|
-----------+-------
|
||||||
|
work_mem | 10MB
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
\dconfig+ work*
|
||||||
|
List of configuration parameters
|
||||||
|
Parameter | Value | Type | Context | Access privileges
|
||||||
|
-----------+-------+---------+---------+-------------------
|
||||||
|
work_mem | 10MB | integer | user |
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
reset work_mem;
|
||||||
-- check \df, \do with argument specifications
|
-- check \df, \do with argument specifications
|
||||||
\df *sqrt
|
\df *sqrt
|
||||||
List of functions
|
List of functions
|
||||||
|
@ -1241,6 +1241,12 @@ drop role regress_partitioning_role;
|
|||||||
\dAp+ btree float_ops
|
\dAp+ btree float_ops
|
||||||
\dAp * pg_catalog.uuid_ops
|
\dAp * pg_catalog.uuid_ops
|
||||||
|
|
||||||
|
-- check \dconfig
|
||||||
|
set work_mem = 10240;
|
||||||
|
\dconfig work_mem
|
||||||
|
\dconfig+ work*
|
||||||
|
reset work_mem;
|
||||||
|
|
||||||
-- check \df, \do with argument specifications
|
-- check \df, \do with argument specifications
|
||||||
\df *sqrt
|
\df *sqrt
|
||||||
\df *sqrt num*
|
\df *sqrt num*
|
||||||
|
Reference in New Issue
Block a user