Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1vsqFC-003ndy-1g for pgsql-hackers@arkaria.postgresql.org; Wed, 18 Feb 2026 22:42:06 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1vsqFA-000hqU-2h for pgsql-hackers@arkaria.postgresql.org; Wed, 18 Feb 2026 22:42:04 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1vsqFA-000hqL-00 for pgsql-hackers@lists.postgresql.org; Wed, 18 Feb 2026 22:42:04 +0000 Received: from sss.pgh.pa.us ([68.162.161.243]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.98.2) (envelope-from ) id 1vsqF3-000000002au-3dTB for pgsql-hackers@postgresql.org; Wed, 18 Feb 2026 22:42:03 +0000 Received: from sss1.sss.pgh.pa.us (localhost [127.0.0.1]) by sss.pgh.pa.us (8.15.2/8.15.2) with ESMTP id 61IMfqWa2226243; Wed, 18 Feb 2026 17:41:52 -0500 From: Tom Lane To: Corey Huinker cc: =?UTF-8?Q?=C3=81lvaro_Herrera?= , Andres Freund , Andrew Dunstan , PostgreSQL-development Subject: Re: generating function default settings from pg_proc.dat In-reply-to: <2134281.1771443182@sss.pgh.pa.us> References: <202602162337.7ye33z25b2jv@alvherre.pgsql> <1390163.1771340431@sss.pgh.pa.us> <2134281.1771443182@sss.pgh.pa.us> Comments: In-reply-to Tom Lane message dated "Wed, 18 Feb 2026 14:33:02 -0500" MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----- =_aaaaaaaaaa0" Content-ID: <2226182.1771454472.0@sss.pgh.pa.us> Date: Wed, 18 Feb 2026 17:41:52 -0500 Message-ID: <2226242.1771454512@sss.pgh.pa.us> List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk ------- =_aaaaaaaaaa0 Content-Type: text/plain; charset="us-ascii" Content-ID: <2226182.1771454472.1@sss.pgh.pa.us> Content-Transfer-Encoding: quoted-printable I wrote: > 2. GRANT/REVOKE operations. Andres muttered something about trying > to integrate those into pg_proc.dat too, and I'm going to go look > at the idea. Here's a draft patch for that. It's pretty simple in concept: in bootstrap mode, let aclitemin() look into a hard-wired table of role names, just as we do for pg_type data before that catalog has been loaded. Everything then basically just works. However, the project bloated on me a little bit, because after removing all the function revoke/grant commands from system_functions.sql, I was left with GRANT pg_read_all_settings TO pg_monitor; GRANT pg_read_all_stats TO pg_monitor; GRANT pg_stat_scan_tables TO pg_monitor; There was some excuse for those to live in system_functions.sql as long as they were beside grants establishing special privileges for those roles, but with those grants gone this seemed like an unacceptably random place for them. So I moved that knowledge into a new catalog data file pg_auth_members.dat. This accomplishes the goal Andres had of eliminating pg_proc update operations during initdb, except for the new-style SQL-language functions set up in system_functions.sql: postgres=3D# select xmin, oid, oid::regprocedure from pg_proc where xmin != =3D 1 and prosqlbody is null; xmin | oid | oid = ------+-------+------------------------------------------------------- 261 | 14095 | dsnowball_init(internal) 262 | 14096 | dsnowball_lexize(internal,internal,internal,internal) 459 | 14161 | information_schema._pg_expandarray(anyarray) 612 | 14511 | plpgsql_call_handler() 612 | 14512 | plpgsql_inline_handler(internal) 612 | 14513 | plpgsql_validator(oid) (6 rows) However, I'm not sure I love it in this form, because what it asks developers to do is populate proacl using aclitemin's notation, eg @@ -8602,7 +8641,8 @@ provolatile =3D> 'v', prorettype =3D> 'record', proargtypes =3D> '', proallargtypes =3D> '{text,int8,int8,int8}', proargmodes =3D> '{o,o,o,o= }', proargnames =3D> '{name,off,size,allocated_size}', - prosrc =3D> 'pg_get_shmem_allocations' }, + prosrc =3D> 'pg_get_shmem_allocations', + proacl =3D> '{postgres=3DX/postgres,pg_read_all_stats=3DX/postgres}' }, = { oid =3D> '4099', descr =3D> 'Is NUMA support available?', proname =3D> 'pg_numa_available', provolatile =3D> 's', prorettype =3D>= 'bool', That's verbose, and not very pretty, and potentially confusing because it's predicated on the assumption that the bootstrap user's name is 'postgres'. This patch does work when the bootstrap user's name is something else, but I don't really like hard-wiring things that way. Is it worth putting in some additional kluge to allow this field to be spelled in a different way, and if so what notation do we want to adopt? One thing we could do for free is to drop the "/postgres" grantor notations, since aclitemin will default to assuming the grantor is the bootstrap superuser. That makes things more compact but doesn't move the needle far otherwise. Another potential objection is specific to the functions that underlie system views: before, their special grants/revokes lived beside similar grants for the associated views. Now those are in two different files with completely different notations. So maybe this has taken the "single source of truth" idea too far, and we should leave system_views.sql alone. Comments welcome. regards, tom lane ------- =_aaaaaaaaaa0 Content-Type: text/x-diff; name*0="v1-0001-Simplify-creation-of-built-in-functions-with-non-.p"; name*1="atch"; charset="us-ascii" Content-ID: <2226182.1771454472.2@sss.pgh.pa.us> Content-Description: v1-0001-Simplify-creation-of-built-in-functions-with-non-.patch Content-Transfer-Encoding: quoted-printable =46rom 28afb7041102eb0b8657746106533a7780aaddc0 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Wed, 18 Feb 2026 17:38:30 -0500 Subject: [PATCH v1] Simplify creation of built-in functions with non-defau= lt ACLs. Up to now, to create such a function, one had to make a pg_proc.dat entry and then modify it with GRANT/REVOKE commands, which we put in system_functions.sql. That seems a little ugly though, because it violates the idea of having a single source of truth about the initial contents of pg_proc, and it results in leaving dead rows in the initial contents of pg_proc. This patch improves matters by allowing aclitemin() to work during early bootstrap, before pg_authid has been loaded. On the same principle that we use for early access to pg_type details, put a table of known built-in role names into bootstrap.c, and use that in bootstrap mode. In this form of the patch, one must write verbatim ACL lists in proacl entries in pg_proc.dat. That seems less than ideal: it requires assuming a particular name for the bootstrap superuser (here "postgres"), and it is a notation that many developers may not be familiar with. Maybe we can think of a better notation. Author: Tom Lane Discussion: https://postgr.es/m/183292bb-4891-4c96-a3ca-e78b5e0e1358@dunsl= ane.net --- src/backend/bootstrap/bootstrap.c | 59 +++++++ src/backend/catalog/system_functions.sql | 166 +------------------ src/backend/catalog/system_views.sql | 14 -- src/backend/utils/adt/acl.c | 14 +- src/include/bootstrap/bootstrap.h | 2 + src/include/catalog/Makefile | 1 + src/include/catalog/meson.build | 1 + src/include/catalog/pg_auth_members.dat | 20 +++ src/include/catalog/pg_auth_members.h | 27 ++- src/include/catalog/pg_authid.dat | 3 + src/include/catalog/pg_proc.dat | 201 +++++++++++++++-------- 11 files changed, 254 insertions(+), 254 deletions(-) create mode 100644 src/include/catalog/pg_auth_members.dat diff --git a/src/backend/bootstrap/bootstrap.c b/src/backend/bootstrap/boo= tstrap.c index 8d601c363b4..e34b157b6de 100644 --- a/src/backend/bootstrap/bootstrap.c +++ b/src/backend/bootstrap/bootstrap.c @@ -25,6 +25,7 @@ #include "access/xact.h" #include "bootstrap/bootstrap.h" #include "catalog/index.h" +#include "catalog/pg_authid.h" #include "catalog/pg_collation.h" #include "catalog/pg_proc.h" #include "catalog/pg_type.h" @@ -115,6 +116,8 @@ static const struct typinfo TypInfo[] =3D { F_JSONB_IN, F_JSONB_OUT}, {"oid", OIDOID, 0, 4, true, TYPALIGN_INT, TYPSTORAGE_PLAIN, InvalidOid, F_OIDIN, F_OIDOUT}, + {"aclitem", ACLITEMOID, 0, 16, false, TYPALIGN_DOUBLE, TYPSTORAGE_PLAIN,= InvalidOid, + F_ACLITEMIN, F_ACLITEMOUT}, {"pg_node_tree", PG_NODE_TREEOID, 0, -1, false, TYPALIGN_INT, TYPSTORAGE= _EXTENDED, DEFAULT_COLLATION_OID, F_PG_NODE_TREE_IN, F_PG_NODE_TREE_OUT}, {"int2vector", INT2VECTOROID, INT2OID, -1, false, TYPALIGN_INT, TYPSTORA= GE_PLAIN, InvalidOid, @@ -144,6 +147,43 @@ struct typmap static List *Typ =3D NIL; /* List of struct typmap* */ static struct typmap *Ap =3D NULL; = +/* + * Basic information about built-in roles. + * + * Presently, this need only list roles that are mentioned in aclitem arr= ays + * in the catalog .dat files. We might as well list everything that is i= n + * pg_authid.dat, since there aren't that many. We assume that the boots= trap + * superuser's name is "postgres", even though it might not be that in th= e + * finished installation; this means aclitem entries in .dat files must s= pell + * it like that. + */ +struct rolinfo +{ + const char *rolname; + Oid oid; +}; + +static const struct rolinfo RolInfo[] =3D { + {"postgres", BOOTSTRAP_SUPERUSERID}, + {"pg_database_owner", ROLE_PG_DATABASE_OWNER}, + {"pg_read_all_data", ROLE_PG_READ_ALL_DATA}, + {"pg_write_all_data", ROLE_PG_WRITE_ALL_DATA}, + {"pg_monitor", ROLE_PG_MONITOR}, + {"pg_read_all_settings", ROLE_PG_READ_ALL_SETTINGS}, + {"pg_read_all_stats", ROLE_PG_READ_ALL_STATS}, + {"pg_stat_scan_tables", ROLE_PG_STAT_SCAN_TABLES}, + {"pg_read_server_files", ROLE_PG_READ_SERVER_FILES}, + {"pg_write_server_files", ROLE_PG_WRITE_SERVER_FILES}, + {"pg_execute_server_program", ROLE_PG_EXECUTE_SERVER_PROGRAM}, + {"pg_signal_backend", ROLE_PG_SIGNAL_BACKEND}, + {"pg_checkpoint", ROLE_PG_CHECKPOINT}, + {"pg_maintain", ROLE_PG_MAINTAIN}, + {"pg_use_reserved_connections", ROLE_PG_USE_RESERVED_CONNECTIONS}, + {"pg_create_subscription", ROLE_PG_CREATE_SUBSCRIPTION}, + {"pg_signal_autovacuum_worker", ROLE_PG_SIGNAL_AUTOVACUUM_WORKER} +}; + + static Datum values[MAXATTR]; /* current row's attribute values */ static bool Nulls[MAXATTR]; = @@ -1034,6 +1074,25 @@ boot_get_type_io_data(Oid typid, } } = +/* ---------------- + * boot_get_role_oid + * + * Look up a role name at bootstrap time. This is equivalent to + * get_role_oid(rolname, true): return the role OID or InvalidOid if + * not found. We only need to cope with built-in role names. + * ---------------- + */ +Oid +boot_get_role_oid(const char *rolname) +{ + for (int i =3D 0; i < lengthof(RolInfo); i++) + { + if (strcmp(RolInfo[i].rolname, rolname) =3D=3D 0) + return RolInfo[i].oid; + } + return InvalidOid; +} + /* ---------------- * AllocateAttribute * diff --git a/src/backend/catalog/system_functions.sql b/src/backend/catalo= g/system_functions.sql index 69699f8830a..1c5b6d6df05 100644 --- a/src/backend/catalog/system_functions.sql +++ b/src/backend/catalog/system_functions.sql @@ -14,12 +14,8 @@ * definitions of such functions into pg_proc.dat and then replace them * here. The stub definitions would be unnecessary were it not that we'd * like these functions to have stable OIDs, the same as other built-in - * functions. - * - * This file also takes care of adjusting privileges for those functions - * that should not have the default public-EXECUTE privileges. (However, - * a small number of functions that exist mainly to underlie system views - * are dealt with in system_views.sql, instead.) + * functions. (That's important, for example, to their treatment by + * postgres_fdw.) * * Note: this file is read in single-user -j mode, which means that the * command terminator is semicolon-newline-newline; whenever the backend @@ -376,161 +372,3 @@ CREATE OR REPLACE FUNCTION ts_debug(document text, BEGIN ATOMIC SELECT * FROM ts_debug(get_current_ts_config(), $1); END; - - --- --- The default permissions for functions mean that anyone can execute the= m. --- A number of functions shouldn't be executable by just anyone, but rath= er --- than use explicit 'superuser()' checks in those functions, we use the = GRANT --- system to REVOKE access to those functions at initdb time. Administra= tors --- can later change who can access these functions, or leave them as only --- available to superuser / cluster owner, if they choose. --- - -REVOKE EXECUTE ON FUNCTION pg_backup_start(text, boolean) FROM public; - -REVOKE EXECUTE ON FUNCTION pg_backup_stop(boolean) FROM public; - -REVOKE EXECUTE ON FUNCTION pg_create_restore_point(text) FROM public; - -REVOKE EXECUTE ON FUNCTION pg_switch_wal() FROM public; - -REVOKE EXECUTE ON FUNCTION pg_log_standby_snapshot() FROM public; - -REVOKE EXECUTE ON FUNCTION pg_wal_replay_pause() FROM public; - -REVOKE EXECUTE ON FUNCTION pg_wal_replay_resume() FROM public; - -REVOKE EXECUTE ON FUNCTION pg_rotate_logfile() FROM public; - -REVOKE EXECUTE ON FUNCTION pg_reload_conf() FROM public; - -REVOKE EXECUTE ON FUNCTION pg_current_logfile() FROM public; - -REVOKE EXECUTE ON FUNCTION pg_current_logfile(text) FROM public; - -REVOKE EXECUTE ON FUNCTION pg_promote(boolean, integer) FROM public; - -REVOKE EXECUTE ON FUNCTION pg_stat_reset() FROM public; - -REVOKE EXECUTE ON FUNCTION pg_stat_reset_shared(text) FROM public; - -REVOKE EXECUTE ON FUNCTION pg_stat_reset_slru(text) FROM public; - -REVOKE EXECUTE ON FUNCTION pg_stat_reset_single_table_counters(oid) FROM = public; - -REVOKE EXECUTE ON FUNCTION pg_stat_reset_single_function_counters(oid) FR= OM public; - -REVOKE EXECUTE ON FUNCTION pg_stat_reset_backend_stats(integer) FROM publ= ic; - -REVOKE EXECUTE ON FUNCTION pg_stat_reset_replication_slot(text) FROM publ= ic; - -REVOKE EXECUTE ON FUNCTION pg_stat_have_stats(text, oid, int8) FROM publi= c; - -REVOKE EXECUTE ON FUNCTION pg_stat_reset_subscription_stats(oid) FROM pub= lic; - -REVOKE EXECUTE ON FUNCTION lo_import(text) FROM public; - -REVOKE EXECUTE ON FUNCTION lo_import(text, oid) FROM public; - -REVOKE EXECUTE ON FUNCTION lo_export(oid, text) FROM public; - -REVOKE EXECUTE ON FUNCTION pg_ls_logdir() FROM public; - -REVOKE EXECUTE ON FUNCTION pg_ls_waldir() FROM public; - -REVOKE EXECUTE ON FUNCTION pg_ls_archive_statusdir() FROM public; - -REVOKE EXECUTE ON FUNCTION pg_ls_summariesdir() FROM public; - -REVOKE EXECUTE ON FUNCTION pg_ls_tmpdir() FROM public; - -REVOKE EXECUTE ON FUNCTION pg_ls_tmpdir(oid) FROM public; - -REVOKE EXECUTE ON FUNCTION pg_read_file(text) FROM public; - -REVOKE EXECUTE ON FUNCTION pg_read_file(text,boolean) FROM public; - -REVOKE EXECUTE ON FUNCTION pg_read_file(text,bigint,bigint) FROM public; - -REVOKE EXECUTE ON FUNCTION pg_read_file(text,bigint,bigint,boolean) FROM = public; - -REVOKE EXECUTE ON FUNCTION pg_read_binary_file(text) FROM public; - -REVOKE EXECUTE ON FUNCTION pg_read_binary_file(text,boolean) FROM public; - -REVOKE EXECUTE ON FUNCTION pg_read_binary_file(text,bigint,bigint) FROM p= ublic; - -REVOKE EXECUTE ON FUNCTION pg_read_binary_file(text,bigint,bigint,boolean= ) FROM public; - -REVOKE EXECUTE ON FUNCTION pg_replication_origin_advance(text, pg_lsn) FR= OM public; - -REVOKE EXECUTE ON FUNCTION pg_replication_origin_create(text) FROM public= ; - -REVOKE EXECUTE ON FUNCTION pg_replication_origin_drop(text) FROM public; - -REVOKE EXECUTE ON FUNCTION pg_replication_origin_oid(text) FROM public; - -REVOKE EXECUTE ON FUNCTION pg_replication_origin_progress(text, boolean) = FROM public; - -REVOKE EXECUTE ON FUNCTION pg_replication_origin_session_is_setup() FROM = public; - -REVOKE EXECUTE ON FUNCTION pg_replication_origin_session_progress(boolean= ) FROM public; - -REVOKE EXECUTE ON FUNCTION pg_replication_origin_session_reset() FROM pub= lic; - -REVOKE EXECUTE ON FUNCTION pg_replication_origin_session_setup(text, inte= ger) FROM public; - -REVOKE EXECUTE ON FUNCTION pg_replication_origin_xact_reset() FROM public= ; - -REVOKE EXECUTE ON FUNCTION pg_replication_origin_xact_setup(pg_lsn, times= tamp with time zone) FROM public; - -REVOKE EXECUTE ON FUNCTION pg_show_replication_origin_status() FROM publi= c; - -REVOKE EXECUTE ON FUNCTION pg_stat_file(text) FROM public; - -REVOKE EXECUTE ON FUNCTION pg_stat_file(text,boolean) FROM public; - -REVOKE EXECUTE ON FUNCTION pg_ls_dir(text) FROM public; - -REVOKE EXECUTE ON FUNCTION pg_ls_dir(text,boolean,boolean) FROM public; - -REVOKE EXECUTE ON FUNCTION pg_log_backend_memory_contexts(integer) FROM P= UBLIC; - -REVOKE EXECUTE ON FUNCTION pg_ls_logicalsnapdir() FROM PUBLIC; - -REVOKE EXECUTE ON FUNCTION pg_ls_logicalmapdir() FROM PUBLIC; - -REVOKE EXECUTE ON FUNCTION pg_ls_replslotdir(text) FROM PUBLIC; - --- --- We also set up some things as accessible to standard roles. --- - -GRANT EXECUTE ON FUNCTION pg_ls_logdir() TO pg_monitor; - -GRANT EXECUTE ON FUNCTION pg_ls_waldir() TO pg_monitor; - -GRANT EXECUTE ON FUNCTION pg_ls_archive_statusdir() TO pg_monitor; - -GRANT EXECUTE ON FUNCTION pg_ls_summariesdir() TO pg_monitor; - -GRANT EXECUTE ON FUNCTION pg_ls_tmpdir() TO pg_monitor; - -GRANT EXECUTE ON FUNCTION pg_ls_tmpdir(oid) TO pg_monitor; - -GRANT EXECUTE ON FUNCTION pg_ls_logicalsnapdir() TO pg_monitor; - -GRANT EXECUTE ON FUNCTION pg_ls_logicalmapdir() TO pg_monitor; - -GRANT EXECUTE ON FUNCTION pg_ls_replslotdir(text) TO pg_monitor; - -GRANT EXECUTE ON FUNCTION pg_current_logfile() TO pg_monitor; - -GRANT EXECUTE ON FUNCTION pg_current_logfile(text) TO pg_monitor; - -GRANT pg_read_all_settings TO pg_monitor; - -GRANT pg_read_all_stats TO pg_monitor; - -GRANT pg_stat_scan_tables TO pg_monitor; diff --git a/src/backend/catalog/system_views.sql b/src/backend/catalog/sy= stem_views.sql index 1ea8f1faa9e..56106d92eaf 100644 --- a/src/backend/catalog/system_views.sql +++ b/src/backend/catalog/system_views.sql @@ -650,19 +650,16 @@ CREATE VIEW pg_file_settings AS SELECT * FROM pg_show_all_file_settings() AS A; = REVOKE ALL ON pg_file_settings FROM PUBLIC; -REVOKE EXECUTE ON FUNCTION pg_show_all_file_settings() FROM PUBLIC; = CREATE VIEW pg_hba_file_rules AS SELECT * FROM pg_hba_file_rules() AS A; = REVOKE ALL ON pg_hba_file_rules FROM PUBLIC; -REVOKE EXECUTE ON FUNCTION pg_hba_file_rules() FROM PUBLIC; = CREATE VIEW pg_ident_file_mappings AS SELECT * FROM pg_ident_file_mappings() AS A; = REVOKE ALL ON pg_ident_file_mappings FROM PUBLIC; -REVOKE EXECUTE ON FUNCTION pg_ident_file_mappings() FROM PUBLIC; = CREATE VIEW pg_timezone_abbrevs AS SELECT * FROM pg_timezone_abbrevs_zone() z @@ -679,39 +676,30 @@ CREATE VIEW pg_config AS SELECT * FROM pg_config(); = REVOKE ALL ON pg_config FROM PUBLIC; -REVOKE EXECUTE ON FUNCTION pg_config() FROM PUBLIC; = CREATE VIEW pg_shmem_allocations AS SELECT * FROM pg_get_shmem_allocations(); = REVOKE ALL ON pg_shmem_allocations FROM PUBLIC; GRANT SELECT ON pg_shmem_allocations TO pg_read_all_stats; -REVOKE EXECUTE ON FUNCTION pg_get_shmem_allocations() FROM PUBLIC; -GRANT EXECUTE ON FUNCTION pg_get_shmem_allocations() TO pg_read_all_stats= ; = CREATE VIEW pg_shmem_allocations_numa AS SELECT * FROM pg_get_shmem_allocations_numa(); = REVOKE ALL ON pg_shmem_allocations_numa FROM PUBLIC; GRANT SELECT ON pg_shmem_allocations_numa TO pg_read_all_stats; -REVOKE EXECUTE ON FUNCTION pg_get_shmem_allocations_numa() FROM PUBLIC; -GRANT EXECUTE ON FUNCTION pg_get_shmem_allocations_numa() TO pg_read_all_= stats; = CREATE VIEW pg_dsm_registry_allocations AS SELECT * FROM pg_get_dsm_registry_allocations(); = REVOKE ALL ON pg_dsm_registry_allocations FROM PUBLIC; GRANT SELECT ON pg_dsm_registry_allocations TO pg_read_all_stats; -REVOKE EXECUTE ON FUNCTION pg_get_dsm_registry_allocations() FROM PUBLIC; -GRANT EXECUTE ON FUNCTION pg_get_dsm_registry_allocations() TO pg_read_al= l_stats; = CREATE VIEW pg_backend_memory_contexts AS SELECT * FROM pg_get_backend_memory_contexts(); = REVOKE ALL ON pg_backend_memory_contexts FROM PUBLIC; GRANT SELECT ON pg_backend_memory_contexts TO pg_read_all_stats; -REVOKE EXECUTE ON FUNCTION pg_get_backend_memory_contexts() FROM PUBLIC; -GRANT EXECUTE ON FUNCTION pg_get_backend_memory_contexts() TO pg_read_all= _stats; = -- Statistics views = @@ -1471,5 +1459,3 @@ CREATE VIEW pg_aios AS SELECT * FROM pg_get_aios(); REVOKE ALL ON pg_aios FROM PUBLIC; GRANT SELECT ON pg_aios TO pg_read_all_stats; -REVOKE EXECUTE ON FUNCTION pg_get_aios() FROM PUBLIC; -GRANT EXECUTE ON FUNCTION pg_get_aios() TO pg_read_all_stats; diff --git a/src/backend/utils/adt/acl.c b/src/backend/utils/adt/acl.c index 641673f0b0e..31067f1f51e 100644 --- a/src/backend/utils/adt/acl.c +++ b/src/backend/utils/adt/acl.c @@ -17,6 +17,7 @@ #include = #include "access/htup_details.h" +#include "bootstrap/bootstrap.h" #include "catalog/catalog.h" #include "catalog/namespace.h" #include "catalog/pg_auth_members.h" @@ -261,6 +262,9 @@ putid(char *p, const char *s) * This routine is called by the parser as well as aclitemin(), hence * the added generality. * + * In bootstrap mode, we consult a hard-wired list of role names + * (see bootstrap.c) rather than trying to access the catalogs. + * * RETURNS: * the string position in 's' immediately following the ACL * specification. Also: @@ -376,7 +380,10 @@ aclparse(const char *s, AclItem *aip, Node *escontext= ) aip->ai_grantee =3D ACL_ID_PUBLIC; else { - aip->ai_grantee =3D get_role_oid(name, true); + if (IsBootstrapProcessingMode()) + aip->ai_grantee =3D boot_get_role_oid(name); + else + aip->ai_grantee =3D get_role_oid(name, true); if (!OidIsValid(aip->ai_grantee)) ereturn(escontext, NULL, (errcode(ERRCODE_UNDEFINED_OBJECT), @@ -396,7 +403,10 @@ aclparse(const char *s, AclItem *aip, Node *escontext= ) ereturn(escontext, NULL, (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), errmsg("a name must follow the \"/\" sign"))); - aip->ai_grantor =3D get_role_oid(name2, true); + if (IsBootstrapProcessingMode()) + aip->ai_grantor =3D boot_get_role_oid(name2); + else + aip->ai_grantor =3D get_role_oid(name2, true); if (!OidIsValid(aip->ai_grantor)) ereturn(escontext, NULL, (errcode(ERRCODE_UNDEFINED_OBJECT), diff --git a/src/include/bootstrap/bootstrap.h b/src/include/bootstrap/boo= tstrap.h index 21447a3d661..e967b2b1885 100644 --- a/src/include/bootstrap/bootstrap.h +++ b/src/include/bootstrap/bootstrap.h @@ -56,6 +56,8 @@ extern void boot_get_type_io_data(Oid typid, Oid *typoutput, Oid *typcollation); = +extern Oid boot_get_role_oid(const char *rolname); + union YYSTYPE; typedef void *yyscan_t; = diff --git a/src/include/catalog/Makefile b/src/include/catalog/Makefile index 24b527230d4..444fc76eed6 100644 --- a/src/include/catalog/Makefile +++ b/src/include/catalog/Makefile @@ -94,6 +94,7 @@ POSTGRES_BKI_DATA =3D \ pg_amop.dat \ pg_amproc.dat \ pg_authid.dat \ + pg_auth_members.dat \ pg_cast.dat \ pg_class.dat \ pg_collation.dat \ diff --git a/src/include/catalog/meson.build b/src/include/catalog/meson.b= uild index 433bcc908ad..bcc01c87c2e 100644 --- a/src/include/catalog/meson.build +++ b/src/include/catalog/meson.build @@ -78,6 +78,7 @@ bki_data =3D [ 'pg_amop.dat', 'pg_amproc.dat', 'pg_authid.dat', + 'pg_auth_members.dat', 'pg_cast.dat', 'pg_class.dat', 'pg_collation.dat', diff --git a/src/include/catalog/pg_auth_members.dat b/src/include/catalog= /pg_auth_members.dat new file mode 100644 index 00000000000..246373251d4 --- /dev/null +++ b/src/include/catalog/pg_auth_members.dat @@ -0,0 +1,20 @@ +#---------------------------------------------------------------------- +# +# pg_auth_members.dat +# Initial contents of the pg_auth_members system catalog. +# +# Portions Copyright (c) 1996-2026, PostgreSQL Global Development Group +# Portions Copyright (c) 1994, Regents of the University of California +# +# src/include/catalog/pg_auth_members.dat +# +#---------------------------------------------------------------------- + +[ + +# We grant these roles to pg_monitor. +{ roleid =3D> 'pg_read_all_settings', member =3D> 'pg_monitor' }, +{ roleid =3D> 'pg_read_all_stats', member =3D> 'pg_monitor' }, +{ roleid =3D> 'pg_stat_scan_tables', member =3D> 'pg_monitor' }, + +] diff --git a/src/include/catalog/pg_auth_members.h b/src/include/catalog/p= g_auth_members.h index 92cf5271496..15806df95bf 100644 --- a/src/include/catalog/pg_auth_members.h +++ b/src/include/catalog/pg_auth_members.h @@ -29,13 +29,26 @@ */ CATALOG(pg_auth_members,1261,AuthMemRelationId) BKI_SHARED_RELATION BKI_R= OWTYPE_OID(2843,AuthMemRelation_Rowtype_Id) BKI_SCHEMA_MACRO { - Oid oid; /* oid */ - Oid roleid BKI_LOOKUP(pg_authid); /* ID of a role */ - Oid member BKI_LOOKUP(pg_authid); /* ID of a member of that role */ - Oid grantor BKI_LOOKUP(pg_authid); /* who granted the membership */ - bool admin_option; /* granted with admin option? */ - bool inherit_option; /* exercise privileges without SET ROLE? */ - bool set_option; /* use SET ROLE to the target role? */ + /* OID for this record (needed for dependencies) */ + Oid oid; + + /* ID of a role */ + Oid roleid BKI_LOOKUP(pg_authid); + + /* ID of a member of that role */ + Oid member BKI_LOOKUP(pg_authid); + + /* who granted the membership */ + Oid grantor BKI_DEFAULT(POSTGRES) BKI_LOOKUP(pg_authid); + + /* granted with admin option? */ + bool admin_option BKI_DEFAULT(f); + + /* exercise privileges without SET ROLE? */ + bool inherit_option BKI_DEFAULT(t); + + /* use SET ROLE to the target role? */ + bool set_option BKI_DEFAULT(t); } FormData_pg_auth_members; = /* ---------------- diff --git a/src/include/catalog/pg_authid.dat b/src/include/catalog/pg_au= thid.dat index 26b5c9971a4..3d376479cbe 100644 --- a/src/include/catalog/pg_authid.dat +++ b/src/include/catalog/pg_authid.dat @@ -18,6 +18,9 @@ # The bootstrap superuser is named POSTGRES according to this data and # according to BKI_DEFAULT entries in other catalogs. However, initdb # will replace that at database initialization time. +# Inconsistently with that, the bootstrap superuser is called "postgres" +# in ACL entries within the catalog .dat files, because boot_get_role_oid= () +# will translate it that way. = { oid =3D> '10', oid_symbol =3D> 'BOOTSTRAP_SUPERUSERID', rolname =3D> 'POSTGRES', rolsuper =3D> 't', rolinherit =3D> 't', diff --git a/src/include/catalog/pg_proc.dat b/src/include/catalog/pg_proc= .dat index dac40992cbc..5399044451e 100644 --- a/src/include/catalog/pg_proc.dat +++ b/src/include/catalog/pg_proc.dat @@ -1822,14 +1822,17 @@ = { oid =3D> '764', descr =3D> 'large object import', proname =3D> 'lo_import', provolatile =3D> 'v', proparallel =3D> 'u', - prorettype =3D> 'oid', proargtypes =3D> 'text', prosrc =3D> 'be_lo_impo= rt' }, + prorettype =3D> 'oid', proargtypes =3D> 'text', prosrc =3D> 'be_lo_impo= rt', + proacl =3D> '{postgres=3DX/postgres}' }, { oid =3D> '767', descr =3D> 'large object import', proname =3D> 'lo_import', provolatile =3D> 'v', proparallel =3D> 'u', prorettype =3D> 'oid', proargtypes =3D> 'text oid', - prosrc =3D> 'be_lo_import_with_oid' }, + prosrc =3D> 'be_lo_import_with_oid', + proacl =3D> '{postgres=3DX/postgres}' }, { oid =3D> '765', descr =3D> 'large object export', proname =3D> 'lo_export', provolatile =3D> 'v', proparallel =3D> 'u', - prorettype =3D> 'int4', proargtypes =3D> 'oid text', prosrc =3D> 'be_lo= _export' }, + prorettype =3D> 'int4', proargtypes =3D> 'oid text', prosrc =3D> 'be_lo= _export', + proacl =3D> '{postgres=3DX/postgres}' }, = { oid =3D> '766', descr =3D> 'increment', proname =3D> 'int4inc', prorettype =3D> 'int4', proargtypes =3D> 'int4'= , @@ -5709,7 +5712,8 @@ { oid =3D> '6230', descr =3D> 'statistics: check if a stats object exists= ', proname =3D> 'pg_stat_have_stats', provolatile =3D> 'v', proparallel =3D= > 'r', prorettype =3D> 'bool', proargtypes =3D> 'text oid int8', - prosrc =3D> 'pg_stat_have_stats' }, + prosrc =3D> 'pg_stat_have_stats', + proacl =3D> '{postgres=3DX/postgres}' }, = { oid =3D> '6231', descr =3D> 'statistics: information about subscription= stats', proname =3D> 'pg_stat_get_subscription_stats', provolatile =3D> 's', @@ -6170,43 +6174,51 @@ { oid =3D> '2274', descr =3D> 'statistics: reset collected statistics for current database= ', proname =3D> 'pg_stat_reset', proisstrict =3D> 'f', provolatile =3D> 'v= ', - prorettype =3D> 'void', proargtypes =3D> '', prosrc =3D> 'pg_stat_reset= ' }, + prorettype =3D> 'void', proargtypes =3D> '', prosrc =3D> 'pg_stat_reset= ', + proacl =3D> '{postgres=3DX/postgres}' }, { oid =3D> '3775', descr =3D> 'statistics: reset collected statistics shared across the cl= uster', proname =3D> 'pg_stat_reset_shared', proisstrict =3D> 'f', provolatile = =3D> 'v', prorettype =3D> 'void', proargtypes =3D> 'text', proargnames =3D> '{target}', proargdefaults =3D> '{NULL}', - prosrc =3D> 'pg_stat_reset_shared' }, + prosrc =3D> 'pg_stat_reset_shared', + proacl =3D> '{postgres=3DX/postgres}' }, { oid =3D> '3776', descr =3D> 'statistics: reset collected statistics for a single table o= r index in the current database or shared across all databases in the clus= ter', proname =3D> 'pg_stat_reset_single_table_counters', provolatile =3D> 'v= ', prorettype =3D> 'void', proargtypes =3D> 'oid', - prosrc =3D> 'pg_stat_reset_single_table_counters' }, + prosrc =3D> 'pg_stat_reset_single_table_counters', + proacl =3D> '{postgres=3DX/postgres}' }, { oid =3D> '3777', descr =3D> 'statistics: reset collected statistics for a single functio= n in the current database', proname =3D> 'pg_stat_reset_single_function_counters', provolatile =3D>= 'v', prorettype =3D> 'void', proargtypes =3D> 'oid', - prosrc =3D> 'pg_stat_reset_single_function_counters' }, + prosrc =3D> 'pg_stat_reset_single_function_counters', + proacl =3D> '{postgres=3DX/postgres}' }, { oid =3D> '6387', descr =3D> 'statistics: reset statistics for a single = backend', proname =3D> 'pg_stat_reset_backend_stats', provolatile =3D> 'v', prorettype =3D> 'void', proargtypes =3D> 'int4', - prosrc =3D> 'pg_stat_reset_backend_stats' }, + prosrc =3D> 'pg_stat_reset_backend_stats', + proacl =3D> '{postgres=3DX/postgres}' }, { oid =3D> '2307', descr =3D> 'statistics: reset collected statistics for a single SLRU', proname =3D> 'pg_stat_reset_slru', proisstrict =3D> 'f', provolatile =3D= > 'v', prorettype =3D> 'void', proargtypes =3D> 'text', proargnames =3D> '{tar= get}', proargdefaults =3D> '{NULL}', - prosrc =3D> 'pg_stat_reset_slru' }, + prosrc =3D> 'pg_stat_reset_slru', + proacl =3D> '{postgres=3DX/postgres}' }, { oid =3D> '6170', descr =3D> 'statistics: reset collected statistics for a single replica= tion slot', proname =3D> 'pg_stat_reset_replication_slot', proisstrict =3D> 'f', provolatile =3D> 'v', prorettype =3D> 'void', proargtypes =3D> 'text', - prosrc =3D> 'pg_stat_reset_replication_slot' }, + prosrc =3D> 'pg_stat_reset_replication_slot', + proacl =3D> '{postgres=3DX/postgres}' }, { oid =3D> '6232', descr =3D> 'statistics: reset collected statistics for a single subscri= ption', proname =3D> 'pg_stat_reset_subscription_stats', proisstrict =3D> 'f', provolatile =3D> 'v', prorettype =3D> 'void', proargtypes =3D> 'oid', - prosrc =3D> 'pg_stat_reset_subscription_stats' }, + prosrc =3D> 'pg_stat_reset_subscription_stats', + proacl =3D> '{postgres=3DX/postgres}' }, = { oid =3D> '3163', descr =3D> 'current trigger depth', proname =3D> 'pg_trigger_depth', provolatile =3D> 's', proparallel =3D>= 'r', @@ -6553,21 +6565,24 @@ proallargtypes =3D> '{text,int4,int4,text,text,bool,text}', proargmodes =3D> '{o,o,o,o,o,o,o}', proargnames =3D> '{sourcefile,sourceline,seqno,name,setting,applied,err= or}', - prosrc =3D> 'show_all_file_settings' }, + prosrc =3D> 'show_all_file_settings', + proacl =3D> '{postgres=3DX/postgres}' }, { oid =3D> '3401', descr =3D> 'show pg_hba.conf rules', proname =3D> 'pg_hba_file_rules', prorows =3D> '1000', proretset =3D> '= t', provolatile =3D> 'v', prorettype =3D> 'record', proargtypes =3D> '', proallargtypes =3D> '{int4,text,int4,text,_text,_text,text,text,text,_t= ext,text}', proargmodes =3D> '{o,o,o,o,o,o,o,o,o,o,o}', proargnames =3D> '{rule_number,file_name,line_number,type,database,user= _name,address,netmask,auth_method,options,error}', - prosrc =3D> 'pg_hba_file_rules' }, + prosrc =3D> 'pg_hba_file_rules', + proacl =3D> '{postgres=3DX/postgres}' }, { oid =3D> '6250', descr =3D> 'show pg_ident.conf mappings', proname =3D> 'pg_ident_file_mappings', prorows =3D> '1000', proretset =3D= > 't', provolatile =3D> 'v', prorettype =3D> 'record', proargtypes =3D> '', proallargtypes =3D> '{int4,text,int4,text,text,text,text}', proargmodes =3D> '{o,o,o,o,o,o,o}', proargnames =3D> '{map_number,file_name,line_number,map_name,sys_name,p= g_username,error}', - prosrc =3D> 'pg_ident_file_mappings' }, + prosrc =3D> 'pg_ident_file_mappings', + proacl =3D> '{postgres=3DX/postgres}' }, { oid =3D> '1371', descr =3D> 'view system lock information', proname =3D> 'pg_lock_status', prorows =3D> '1000', proretset =3D> 't', provolatile =3D> 'v', prorettype =3D> 'record', proargtypes =3D> '', @@ -6737,30 +6752,36 @@ proname =3D> 'pg_backup_start', provolatile =3D> 'v', proparallel =3D> = 'r', prorettype =3D> 'pg_lsn', proargtypes =3D> 'text bool', proargnames =3D> '{label,fast}', proargdefaults =3D> '{false}', - prosrc =3D> 'pg_backup_start' }, + prosrc =3D> 'pg_backup_start', + proacl =3D> '{postgres=3DX/postgres}' }, { oid =3D> '2739', descr =3D> 'finish taking an online backup', proname =3D> 'pg_backup_stop', provolatile =3D> 'v', proparallel =3D> '= r', prorettype =3D> 'record', proargtypes =3D> 'bool', proallargtypes =3D> '{bool,pg_lsn,text,text}', proargmodes =3D> '{i,o,o= ,o}', proargnames =3D> '{wait_for_archive,lsn,labelfile,spcmapfile}', proargdefaults =3D> '{true}', - prosrc =3D> 'pg_backup_stop' }, + prosrc =3D> 'pg_backup_stop', + proacl =3D> '{postgres=3DX/postgres}' }, { oid =3D> '3436', descr =3D> 'promote standby server', proname =3D> 'pg_promote', provolatile =3D> 'v', prorettype =3D> 'bool'= , proargtypes =3D> 'bool int4', proargnames =3D> '{wait,wait_seconds}', proargdefaults =3D> '{true,60}', - prosrc =3D> 'pg_promote' }, + prosrc =3D> 'pg_promote', + proacl =3D> '{postgres=3DX/postgres}' }, { oid =3D> '2848', descr =3D> 'switch to new wal file', proname =3D> 'pg_switch_wal', provolatile =3D> 'v', prorettype =3D> 'pg= _lsn', - proargtypes =3D> '', prosrc =3D> 'pg_switch_wal' }, + proargtypes =3D> '', prosrc =3D> 'pg_switch_wal', + proacl =3D> '{postgres=3DX/postgres}' }, { oid =3D> '6305', descr =3D> 'log details of the current snapshot to WAL= ', proname =3D> 'pg_log_standby_snapshot', provolatile =3D> 'v', prorettype =3D> 'pg_lsn', proargtypes =3D> '', - prosrc =3D> 'pg_log_standby_snapshot' }, + prosrc =3D> 'pg_log_standby_snapshot', + proacl =3D> '{postgres=3DX/postgres}' }, { oid =3D> '3098', descr =3D> 'create a named restore point', proname =3D> 'pg_create_restore_point', provolatile =3D> 'v', prorettype =3D> 'pg_lsn', proargtypes =3D> 'text', - prosrc =3D> 'pg_create_restore_point' }, + prosrc =3D> 'pg_create_restore_point', + proacl =3D> '{postgres=3DX/postgres}' }, { oid =3D> '2849', descr =3D> 'current wal write location', proname =3D> 'pg_current_wal_lsn', provolatile =3D> 'v', prorettype =3D= > 'pg_lsn', proargtypes =3D> '', prosrc =3D> 'pg_current_wal_lsn' }, @@ -6816,10 +6837,12 @@ = { oid =3D> '3071', descr =3D> 'pause wal replay', proname =3D> 'pg_wal_replay_pause', provolatile =3D> 'v', prorettype =3D= > 'void', - proargtypes =3D> '', prosrc =3D> 'pg_wal_replay_pause' }, + proargtypes =3D> '', prosrc =3D> 'pg_wal_replay_pause', + proacl =3D> '{postgres=3DX/postgres}' }, { oid =3D> '3072', descr =3D> 'resume wal replay, if it was paused', proname =3D> 'pg_wal_replay_resume', provolatile =3D> 'v', prorettype =3D= > 'void', - proargtypes =3D> '', prosrc =3D> 'pg_wal_replay_resume' }, + proargtypes =3D> '', prosrc =3D> 'pg_wal_replay_resume', + proacl =3D> '{postgres=3DX/postgres}' }, { oid =3D> '3073', descr =3D> 'true if wal replay is paused', proname =3D> 'pg_is_wal_replay_paused', provolatile =3D> 'v', prorettype =3D> 'bool', proargtypes =3D> '', @@ -6845,17 +6868,21 @@ = { oid =3D> '2621', descr =3D> 'reload configuration files', proname =3D> 'pg_reload_conf', provolatile =3D> 'v', prorettype =3D> 'b= ool', - proargtypes =3D> '', prosrc =3D> 'pg_reload_conf' }, + proargtypes =3D> '', prosrc =3D> 'pg_reload_conf', + proacl =3D> '{postgres=3DX/postgres}' }, { oid =3D> '2622', descr =3D> 'rotate log file', proname =3D> 'pg_rotate_logfile', provolatile =3D> 'v', prorettype =3D>= 'bool', - proargtypes =3D> '', prosrc =3D> 'pg_rotate_logfile' }, + proargtypes =3D> '', prosrc =3D> 'pg_rotate_logfile', + proacl =3D> '{postgres=3DX/postgres}' }, { oid =3D> '3800', descr =3D> 'current logging collector file location', proname =3D> 'pg_current_logfile', proisstrict =3D> 'f', provolatile =3D= > 'v', - prorettype =3D> 'text', proargtypes =3D> '', prosrc =3D> 'pg_current_lo= gfile' }, + prorettype =3D> 'text', proargtypes =3D> '', prosrc =3D> 'pg_current_lo= gfile', + proacl =3D> '{postgres=3DX/postgres,pg_monitor=3DX/postgres}' }, { oid =3D> '3801', descr =3D> 'current logging collector file location', proname =3D> 'pg_current_logfile', proisstrict =3D> 'f', provolatile =3D= > 'v', prorettype =3D> 'text', proargtypes =3D> 'text', - prosrc =3D> 'pg_current_logfile_1arg' }, + prosrc =3D> 'pg_current_logfile_1arg', + proacl =3D> '{postgres=3DX/postgres,pg_monitor=3DX/postgres}' }, = { oid =3D> '2623', descr =3D> 'get information about file', proname =3D> 'pg_stat_file', provolatile =3D> 'v', prorettype =3D> 'rec= ord', @@ -6863,48 +6890,60 @@ proallargtypes =3D> '{text,int8,timestamptz,timestamptz,timestamptz,tim= estamptz,bool}', proargmodes =3D> '{i,o,o,o,o,o,o}', proargnames =3D> '{filename,size,access,modification,change,creation,is= dir}', - prosrc =3D> 'pg_stat_file_1arg' }, + prosrc =3D> 'pg_stat_file_1arg', + proacl =3D> '{postgres=3DX/postgres}' }, { oid =3D> '3307', descr =3D> 'get information about file', proname =3D> 'pg_stat_file', provolatile =3D> 'v', prorettype =3D> 'rec= ord', proargtypes =3D> 'text bool', proallargtypes =3D> '{text,bool,int8,timestamptz,timestamptz,timestampt= z,timestamptz,bool}', proargmodes =3D> '{i,i,o,o,o,o,o,o}', proargnames =3D> '{filename,missing_ok,size,access,modification,change,= creation,isdir}', - prosrc =3D> 'pg_stat_file' }, + prosrc =3D> 'pg_stat_file', + proacl =3D> '{postgres=3DX/postgres}' }, { oid =3D> '2624', descr =3D> 'read text from a file', proname =3D> 'pg_read_file', provolatile =3D> 'v', prorettype =3D> 'tex= t', - proargtypes =3D> 'text int8 int8', prosrc =3D> 'pg_read_file_off_len' }= , + proargtypes =3D> 'text int8 int8', prosrc =3D> 'pg_read_file_off_len', + proacl =3D> '{postgres=3DX/postgres}' }, { oid =3D> '3293', descr =3D> 'read text from a file', proname =3D> 'pg_read_file', provolatile =3D> 'v', prorettype =3D> 'tex= t', proargtypes =3D> 'text int8 int8 bool', - prosrc =3D> 'pg_read_file_off_len_missing' }, + prosrc =3D> 'pg_read_file_off_len_missing', + proacl =3D> '{postgres=3DX/postgres}' }, { oid =3D> '3826', descr =3D> 'read text from a file', proname =3D> 'pg_read_file', provolatile =3D> 'v', prorettype =3D> 'tex= t', - proargtypes =3D> 'text', prosrc =3D> 'pg_read_file_all' }, + proargtypes =3D> 'text', prosrc =3D> 'pg_read_file_all', + proacl =3D> '{postgres=3DX/postgres}' }, { oid =3D> '6208', descr =3D> 'read text from a file', proname =3D> 'pg_read_file', provolatile =3D> 'v', prorettype =3D> 'tex= t', - proargtypes =3D> 'text bool', prosrc =3D> 'pg_read_file_all_missing' }, + proargtypes =3D> 'text bool', prosrc =3D> 'pg_read_file_all_missing', + proacl =3D> '{postgres=3DX/postgres}' }, { oid =3D> '3827', descr =3D> 'read bytea from a file', proname =3D> 'pg_read_binary_file', provolatile =3D> 'v', prorettype =3D= > 'bytea', - proargtypes =3D> 'text int8 int8', prosrc =3D> 'pg_read_binary_file_off= _len' }, + proargtypes =3D> 'text int8 int8', prosrc =3D> 'pg_read_binary_file_off= _len', + proacl =3D> '{postgres=3DX/postgres}' }, { oid =3D> '3295', descr =3D> 'read bytea from a file', proname =3D> 'pg_read_binary_file', provolatile =3D> 'v', prorettype =3D= > 'bytea', proargtypes =3D> 'text int8 int8 bool', - prosrc =3D> 'pg_read_binary_file_off_len_missing' }, + prosrc =3D> 'pg_read_binary_file_off_len_missing', + proacl =3D> '{postgres=3DX/postgres}' }, { oid =3D> '3828', descr =3D> 'read bytea from a file', proname =3D> 'pg_read_binary_file', provolatile =3D> 'v', prorettype =3D= > 'bytea', - proargtypes =3D> 'text', prosrc =3D> 'pg_read_binary_file_all' }, + proargtypes =3D> 'text', prosrc =3D> 'pg_read_binary_file_all', + proacl =3D> '{postgres=3DX/postgres}' }, { oid =3D> '6209', descr =3D> 'read bytea from a file', proname =3D> 'pg_read_binary_file', provolatile =3D> 'v', prorettype =3D= > 'bytea', - proargtypes =3D> 'text bool', prosrc =3D> 'pg_read_binary_file_all_miss= ing' }, + proargtypes =3D> 'text bool', prosrc =3D> 'pg_read_binary_file_all_miss= ing', + proacl =3D> '{postgres=3DX/postgres}' }, { oid =3D> '2625', descr =3D> 'list all files in a directory', proname =3D> 'pg_ls_dir', prorows =3D> '1000', proretset =3D> 't', provolatile =3D> 'v', prorettype =3D> 'text', proargtypes =3D> 'text', - prosrc =3D> 'pg_ls_dir_1arg' }, + prosrc =3D> 'pg_ls_dir_1arg', + proacl =3D> '{postgres=3DX/postgres}' }, { oid =3D> '3297', descr =3D> 'list all files in a directory', proname =3D> 'pg_ls_dir', prorows =3D> '1000', proretset =3D> 't', provolatile =3D> 'v', prorettype =3D> 'text', proargtypes =3D> 'text bo= ol bool', - prosrc =3D> 'pg_ls_dir' }, + prosrc =3D> 'pg_ls_dir', + proacl =3D> '{postgres=3DX/postgres}' }, { oid =3D> '2626', descr =3D> 'sleep for the specified time in seconds', proname =3D> 'pg_sleep', provolatile =3D> 'v', prorettype =3D> 'void', proargtypes =3D> 'float8', prosrc =3D> 'pg_sleep' }, @@ -8602,7 +8641,8 @@ provolatile =3D> 'v', prorettype =3D> 'record', proargtypes =3D> '', proallargtypes =3D> '{text,int8,int8,int8}', proargmodes =3D> '{o,o,o,o= }', proargnames =3D> '{name,off,size,allocated_size}', - prosrc =3D> 'pg_get_shmem_allocations' }, + prosrc =3D> 'pg_get_shmem_allocations', + proacl =3D> '{postgres=3DX/postgres,pg_read_all_stats=3DX/postgres}' }, = { oid =3D> '4099', descr =3D> 'Is NUMA support available?', proname =3D> 'pg_numa_available', provolatile =3D> 's', prorettype =3D>= 'bool', @@ -8614,7 +8654,8 @@ provolatile =3D> 'v', prorettype =3D> 'record', proargtypes =3D> '', proallargtypes =3D> '{text,int4,int8}', proargmodes =3D> '{o,o,o}', proargnames =3D> '{name,numa_node,size}', - prosrc =3D> 'pg_get_shmem_allocations_numa' }, + prosrc =3D> 'pg_get_shmem_allocations_numa', + proacl =3D> '{postgres=3DX/postgres,pg_read_all_stats=3DX/postgres}' }, = { oid =3D> '9314', descr =3D> 'shared memory allocations tracked in the DSM registry', @@ -8622,7 +8663,8 @@ proretset =3D> 't', provolatile =3D> 'v', prorettype =3D> 'record', proargtypes =3D> '', proallargtypes =3D> '{text,text,int8}', proargmodes =3D> '{o,o,o}', proargnames =3D> '{name,type,size}', - prosrc =3D> 'pg_get_dsm_registry_allocations' }, + prosrc =3D> 'pg_get_dsm_registry_allocations', + proacl =3D> '{postgres=3DX/postgres,pg_read_all_stats=3DX/postgres}' }, = # memory context of local backend { oid =3D> '2282', @@ -8633,13 +8675,15 @@ proallargtypes =3D> '{text,text,text,int4,_int4,int8,int8,int8,int8,int= 8}', proargmodes =3D> '{o,o,o,o,o,o,o,o,o,o}', proargnames =3D> '{name, ident, type, level, path, total_bytes, total_n= blocks, free_bytes, free_chunks, used_bytes}', - prosrc =3D> 'pg_get_backend_memory_contexts' }, + prosrc =3D> 'pg_get_backend_memory_contexts', + proacl =3D> '{postgres=3DX/postgres,pg_read_all_stats=3DX/postgres}' }, = # logging memory contexts of the specified backend { oid =3D> '4543', descr =3D> 'log memory contexts of the specified backe= nd', proname =3D> 'pg_log_backend_memory_contexts', provolatile =3D> 'v', prorettype =3D> 'bool', proargtypes =3D> 'int4', - prosrc =3D> 'pg_log_backend_memory_contexts' }, + prosrc =3D> 'pg_log_backend_memory_contexts', + proacl =3D> '{postgres=3DX/postgres}' }, = # non-persistent series generator { oid =3D> '1066', descr =3D> 'non-persistent series generator', @@ -12312,63 +12356,74 @@ { oid =3D> '6003', descr =3D> 'create a replication origin', proname =3D> 'pg_replication_origin_create', provolatile =3D> 'v', proparallel =3D> 'u', prorettype =3D> 'oid', proargtypes =3D> 'text', - prosrc =3D> 'pg_replication_origin_create' }, + prosrc =3D> 'pg_replication_origin_create', + proacl =3D> '{postgres=3DX/postgres}' }, = { oid =3D> '6004', descr =3D> 'drop replication origin identified by its = name', proname =3D> 'pg_replication_origin_drop', provolatile =3D> 'v', proparallel =3D> 'u', prorettype =3D> 'void', proargtypes =3D> 'text', - prosrc =3D> 'pg_replication_origin_drop' }, + prosrc =3D> 'pg_replication_origin_drop', + proacl =3D> '{postgres=3DX/postgres}' }, = { oid =3D> '6005', descr =3D> 'translate the replication origin\'s name to its id', proname =3D> 'pg_replication_origin_oid', provolatile =3D> 's', prorettype =3D> 'oid', proargtypes =3D> 'text', - prosrc =3D> 'pg_replication_origin_oid' }, + prosrc =3D> 'pg_replication_origin_oid', + proacl =3D> '{postgres=3DX/postgres}' }, = { oid =3D> '6006', descr =3D> 'configure session to maintain replication progress tracking= for the passed in origin', proname =3D> 'pg_replication_origin_session_setup', provolatile =3D> 'v= ', proparallel =3D> 'u', prorettype =3D> 'void', proargtypes =3D> 'text in= t4', proargnames =3D> '{node_name,pid}', proargdefaults =3D> '{0}', - prosrc =3D> 'pg_replication_origin_session_setup' }, + prosrc =3D> 'pg_replication_origin_session_setup', + proacl =3D> '{postgres=3DX/postgres}' }, = { oid =3D> '6007', descr =3D> 'teardown configured replication progress t= racking', proname =3D> 'pg_replication_origin_session_reset', provolatile =3D> 'v= ', proparallel =3D> 'u', prorettype =3D> 'void', proargtypes =3D> '', - prosrc =3D> 'pg_replication_origin_session_reset' }, + prosrc =3D> 'pg_replication_origin_session_reset', + proacl =3D> '{postgres=3DX/postgres}' }, = { oid =3D> '6008', descr =3D> 'is a replication origin configured in this session', proname =3D> 'pg_replication_origin_session_is_setup', provolatile =3D>= 'v', proparallel =3D> 'r', prorettype =3D> 'bool', proargtypes =3D> '', - prosrc =3D> 'pg_replication_origin_session_is_setup' }, + prosrc =3D> 'pg_replication_origin_session_is_setup', + proacl =3D> '{postgres=3DX/postgres}' }, = { oid =3D> '6009', descr =3D> 'get the replication progress of the current session', proname =3D> 'pg_replication_origin_session_progress', provolatile =3D>= 'v', proparallel =3D> 'u', prorettype =3D> 'pg_lsn', proargtypes =3D> 'bool'= , - prosrc =3D> 'pg_replication_origin_session_progress' }, + prosrc =3D> 'pg_replication_origin_session_progress', + proacl =3D> '{postgres=3DX/postgres}' }, = { oid =3D> '6010', descr =3D> 'setup the transaction\'s origin lsn and ti= mestamp', proname =3D> 'pg_replication_origin_xact_setup', provolatile =3D> 'v', proparallel =3D> 'r', prorettype =3D> 'void', proargtypes =3D> 'pg_lsn = timestamptz', - prosrc =3D> 'pg_replication_origin_xact_setup' }, + prosrc =3D> 'pg_replication_origin_xact_setup', + proacl =3D> '{postgres=3DX/postgres}' }, = { oid =3D> '6011', descr =3D> 'reset the transaction\'s origin lsn and ti= mestamp', proname =3D> 'pg_replication_origin_xact_reset', provolatile =3D> 'v', proparallel =3D> 'r', prorettype =3D> 'void', proargtypes =3D> '', - prosrc =3D> 'pg_replication_origin_xact_reset' }, + prosrc =3D> 'pg_replication_origin_xact_reset', + proacl =3D> '{postgres=3DX/postgres}' }, = { oid =3D> '6012', descr =3D> 'advance replication origin to specific loc= ation', proname =3D> 'pg_replication_origin_advance', provolatile =3D> 'v', proparallel =3D> 'u', prorettype =3D> 'void', proargtypes =3D> 'text pg= _lsn', - prosrc =3D> 'pg_replication_origin_advance' }, + prosrc =3D> 'pg_replication_origin_advance', + proacl =3D> '{postgres=3DX/postgres}' }, = { oid =3D> '6013', descr =3D> 'get an individual replication origin\'s replication progres= s', proname =3D> 'pg_replication_origin_progress', provolatile =3D> 'v', proparallel =3D> 'u', prorettype =3D> 'pg_lsn', proargtypes =3D> 'text = bool', - prosrc =3D> 'pg_replication_origin_progress' }, + prosrc =3D> 'pg_replication_origin_progress', + proacl =3D> '{postgres=3DX/postgres}' }, = { oid =3D> '6014', descr =3D> 'get progress for all replication origins', proname =3D> 'pg_show_replication_origin_status', prorows =3D> '100', @@ -12376,7 +12431,8 @@ prorettype =3D> 'record', proargtypes =3D> '', proallargtypes =3D> '{oid,text,pg_lsn,pg_lsn}', proargmodes =3D> '{o,o,= o,o}', proargnames =3D> '{local_id, external_id, remote_lsn, local_lsn}', - prosrc =3D> 'pg_show_replication_origin_status' }, + prosrc =3D> 'pg_show_replication_origin_status', + proacl =3D> '{postgres=3DX/postgres}' }, = # publications { oid =3D> '6119', @@ -12414,7 +12470,8 @@ proname =3D> 'pg_config', prorows =3D> '23', proretset =3D> 't', provol= atile =3D> 's', proparallel =3D> 'r', prorettype =3D> 'record', proargtypes =3D> '', proallargtypes =3D> '{text,text}', proargmodes =3D> '{o,o}', - proargnames =3D> '{name,setting}', prosrc =3D> 'pg_config' }, + proargnames =3D> '{name,setting}', prosrc =3D> 'pg_config', + proacl =3D> '{postgres=3DX/postgres}' }, = # pg_controldata related functions { oid =3D> '3441', @@ -12489,49 +12546,57 @@ proname =3D> 'pg_ls_logdir', procost =3D> '10', prorows =3D> '20', pror= etset =3D> 't', provolatile =3D> 'v', prorettype =3D> 'record', proargtypes =3D> '', proallargtypes =3D> '{text,int8,timestamptz}', proargmodes =3D> '{o,o,o= }', - proargnames =3D> '{name,size,modification}', prosrc =3D> 'pg_ls_logdir'= }, + proargnames =3D> '{name,size,modification}', prosrc =3D> 'pg_ls_logdir'= , + proacl =3D> '{postgres=3DX/postgres,pg_monitor=3DX/postgres}' }, { oid =3D> '3354', descr =3D> 'list of files in the WAL directory', proname =3D> 'pg_ls_waldir', procost =3D> '10', prorows =3D> '20', pror= etset =3D> 't', provolatile =3D> 'v', prorettype =3D> 'record', proargtypes =3D> '', proallargtypes =3D> '{text,int8,timestamptz}', proargmodes =3D> '{o,o,o= }', - proargnames =3D> '{name,size,modification}', prosrc =3D> 'pg_ls_waldir'= }, + proargnames =3D> '{name,size,modification}', prosrc =3D> 'pg_ls_waldir'= , + proacl =3D> '{postgres=3DX/postgres,pg_monitor=3DX/postgres}' }, { oid =3D> '6400', descr =3D> 'list of files in the pg_wal/summaries dire= ctory', proname =3D> 'pg_ls_summariesdir', procost =3D> '10', prorows =3D> '20'= , proretset =3D> 't', provolatile =3D> 'v', prorettype =3D> 'record', proargtypes =3D> '', proallargtypes =3D> '{text,int8,timestamptz}', proargmodes =3D> '{o,o,o}', proargnames =3D> '{name,size,modification}'= , - prosrc =3D> 'pg_ls_summariesdir' }, + prosrc =3D> 'pg_ls_summariesdir', + proacl =3D> '{postgres=3DX/postgres,pg_monitor=3DX/postgres}' }, { oid =3D> '5031', descr =3D> 'list of files in the archive_status direct= ory', proname =3D> 'pg_ls_archive_statusdir', procost =3D> '10', prorows =3D>= '20', proretset =3D> 't', provolatile =3D> 'v', prorettype =3D> 'record', proargtypes =3D> '', proallargtypes =3D> '{text,int8,timestamptz}', proargmodes =3D> '{o,o,o}', proargnames =3D> '{name,size,modification}'= , - prosrc =3D> 'pg_ls_archive_statusdir' }, + prosrc =3D> 'pg_ls_archive_statusdir', + proacl =3D> '{postgres=3DX/postgres,pg_monitor=3DX/postgres}' }, { oid =3D> '5029', descr =3D> 'list files in the pgsql_tmp directory', proname =3D> 'pg_ls_tmpdir', procost =3D> '10', prorows =3D> '20', pror= etset =3D> 't', provolatile =3D> 'v', prorettype =3D> 'record', proargtypes =3D> '', proallargtypes =3D> '{text,int8,timestamptz}', proargmodes =3D> '{o,o,o= }', - proargnames =3D> '{name,size,modification}', prosrc =3D> 'pg_ls_tmpdir_= noargs' }, + proargnames =3D> '{name,size,modification}', prosrc =3D> 'pg_ls_tmpdir_= noargs', + proacl =3D> '{postgres=3DX/postgres,pg_monitor=3DX/postgres}' }, { oid =3D> '5030', descr =3D> 'list files in the pgsql_tmp directory', proname =3D> 'pg_ls_tmpdir', procost =3D> '10', prorows =3D> '20', pror= etset =3D> 't', provolatile =3D> 'v', prorettype =3D> 'record', proargtypes =3D> 'oid', proallargtypes =3D> '{oid,text,int8,timestamptz}', proargmodes =3D> '{i= ,o,o,o}', proargnames =3D> '{tablespace,name,size,modification}', - prosrc =3D> 'pg_ls_tmpdir_1arg' }, + prosrc =3D> 'pg_ls_tmpdir_1arg', + proacl =3D> '{postgres=3DX/postgres,pg_monitor=3DX/postgres}' }, { oid =3D> '6270', descr =3D> 'list of files in the pg_logical/snapshots directory', proname =3D> 'pg_ls_logicalsnapdir', procost =3D> '10', prorows =3D> '2= 0', proretset =3D> 't', provolatile =3D> 'v', prorettype =3D> 'record', proargtypes =3D> '', proallargtypes =3D> '{text,int8,timestamptz}', proargmodes =3D> '{o,o,o}', proargnames =3D> '{name,size,modification}'= , - prosrc =3D> 'pg_ls_logicalsnapdir' }, + prosrc =3D> 'pg_ls_logicalsnapdir', + proacl =3D> '{postgres=3DX/postgres,pg_monitor=3DX/postgres}' }, { oid =3D> '6271', descr =3D> 'list of files in the pg_logical/mappings directory', proname =3D> 'pg_ls_logicalmapdir', procost =3D> '10', prorows =3D> '20= ', proretset =3D> 't', provolatile =3D> 'v', prorettype =3D> 'record', proargtypes =3D> '', proallargtypes =3D> '{text,int8,timestamptz}', proargmodes =3D> '{o,o,o}', proargnames =3D> '{name,size,modification}'= , - prosrc =3D> 'pg_ls_logicalmapdir' }, + prosrc =3D> 'pg_ls_logicalmapdir', + proacl =3D> '{postgres=3DX/postgres,pg_monitor=3DX/postgres}' }, { oid =3D> '6272', descr =3D> 'list of files in the pg_replslot/slot_name directory', proname =3D> 'pg_ls_replslotdir', procost =3D> '10', prorows =3D> '20', @@ -12539,7 +12604,8 @@ proargtypes =3D> 'text', proallargtypes =3D> '{text,text,int8,timestamp= tz}', proargmodes =3D> '{i,o,o,o}', proargnames =3D> '{slot_name,name,size,modification}', - prosrc =3D> 'pg_ls_replslotdir' }, + prosrc =3D> 'pg_ls_replslotdir', + proacl =3D> '{postgres=3DX/postgres,pg_monitor=3DX/postgres}' }, = # hash partitioning constraint function { oid =3D> '5028', descr =3D> 'hash partition CHECK constraint', @@ -12702,7 +12768,8 @@ proallargtypes =3D> '{int4,int4,int8,text,text,int8,int8,text,int2,int4= ,text,text,bool,bool,bool}', proargmodes =3D> '{o,o,o,o,o,o,o,o,o,o,o,o,o,o,o}', proargnames =3D> '{pid,io_id,io_generation,state,operation,off,length,t= arget,handle_data_len,raw_result,result,target_desc,f_sync,f_localmem,f_bu= ffered}', - prosrc =3D> 'pg_get_aios' }, + prosrc =3D> 'pg_get_aios', + proacl =3D> '{postgres=3DX/postgres,pg_read_all_stats=3DX/postgres}' }, = # oid8 related functions { oid =3D> '8255', descr =3D> 'convert oid to oid8', -- = 2.43.7 ------- =_aaaaaaaaaa0--