postgres.git / summary / log / commit / refs

commit    e6e8a3078b094f209f6e40822c1655ebd34429f5
Author:   Fujii Masao <fujii@postgresql.org>
Date:     Sat Jul 25 10:10:49 2026 +0000

    psql: Allow pg_read_all_stats to see database size in \l+
    
    pg_database_size() allows access to users who have either CONNECT
    privilege on the target database or privileges of the pg_read_all_stats
    role. However, previously, psql's \l+ checked only for CONNECT,
    so users with privileges of pg_read_all_stats still saw "No Access" for
    databases they could not connect to.
    
    Fix this by making \l+ also check
    pg_has_role('pg_read_all_stats', 'USAGE'), matching
    pg_database_size()'s permission rules.
    
    For back branches, emit the pg_read_all_stats check only when
    connected to PostgreSQL 10 or later, since earlier releases do not have
    that predefined role.
    
    Backpatch to all supported versions.
    
    Author: Christoph Berg <myon@debian.org>
    Reviewed-by: Álvaro Herrera <alvherre@kurilemu.de>
    Reviewed-by: Fujii Masao <masao.fujii@gmail.com>
    Discussion: https://postgr.es/m/amCo6qRmnfPVk4-V@msg.df7cb.de
    Backpatch-through: 14


doc/src/sgml/ref/psql-ref.sgml | 5 +++-- src/bin/psql/describe.c | 4 ++++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/doc/src/sgml/ref/psql-ref.sgml b/doc/src/sgml/ref/psql-ref.sgml index ca3b3db59c8..a8b00c10162 100644 --- a/doc/src/sgml/ref/psql-ref.sgml +++ b/doc/src/sgml/ref/psql-ref.sgml @@ -2571,8 +2571,9 @@ SELECT only databases whose names match the pattern are listed. If <literal>+</literal> is appended to the command name, database sizes, default tablespaces, and descriptions are also displayed. - (Size information is only available for databases that the current - user can connect to.) + Size information is available for databases on which the current user has + <literal>CONNECT</literal> privilege, or if the current user is a superuser + or has privileges of the <literal>pg_read_all_stats</literal> role. </para> </listitem> </varlistentry> diff --git a/src/bin/psql/describe.c b/src/bin/psql/describe.c index 3823dca7be2..3fccc543bad 100644 --- a/src/bin/psql/describe.c +++ b/src/bin/psql/describe.c @@ -953,16 +953,20 @@ listAllDbs(const char *pattern, bool verbose) appendPQExpBufferStr(&buf, " "); printACLColumn(&buf, "d.datacl"); if (verbose) + { appendPQExpBuffer(&buf, ",\n CASE WHEN pg_catalog.has_database_privilege(d.datname, 'CONNECT')\n" + " %s" " THEN pg_catalog.pg_size_pretty(pg_catalog.pg_database_size(d.datname))\n" " ELSE 'No Access'\n" " END as \"%s\"" ",\n t.spcname as \"%s\"" ",\n pg_catalog.shobj_description(d.oid, 'pg_database') as \"%s\"", + pset.sversion >= 100000 ? "OR pg_catalog.pg_has_role('pg_read_all_stats', 'USAGE')\n" : "", gettext_noop("Size"), gettext_noop("Tablespace"), gettext_noop("Description")); + } appendPQExpBufferStr(&buf, "\nFROM pg_catalog.pg_database d\n"); if (verbose) [parent: 0e69b44dc2c1]