v1-0001-Simplify-creation-of-built-in-functions-with-non-.patch
text/x-diff
Filename: v1-0001-Simplify-creation-of-built-in-functions-with-non-.patch
Type: text/x-diff
Part: 0
Patch
Format: format-patch
Series: patch v1-0001
Subject: Simplify creation of built-in functions with non-default ACLs.
| File | + | − |
|---|---|---|
| src/backend/bootstrap/bootstrap.c | 59 | 0 |
| src/backend/catalog/system_functions.sql | 2 | 164 |
| src/backend/catalog/system_views.sql | 0 | 14 |
| src/backend/utils/adt/acl.c | 12 | 2 |
| src/include/bootstrap/bootstrap.h | 2 | 0 |
| src/include/catalog/Makefile | 1 | 0 |
| src/include/catalog/meson.build | 1 | 0 |
| src/include/catalog/pg_authid.dat | 3 | 0 |
| src/include/catalog/pg_auth_members.dat | 20 | 0 |
| src/include/catalog/pg_auth_members.h | 20 | 7 |
| src/include/catalog/pg_proc.dat | 134 | 67 |
From 28afb7041102eb0b8657746106533a7780aaddc0 Mon Sep 17 00:00:00 2001
From: Tom Lane <tgl@sss.pgh.pa.us>
Date: Wed, 18 Feb 2026 17:38:30 -0500
Subject: [PATCH v1] Simplify creation of built-in functions with non-default
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 <tgl@sss.pgh.pa.us>
Discussion: https://postgr.es/m/183292bb-4891-4c96-a3ca-e78b5e0e1358@dunslane.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/bootstrap.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[] = {
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, TYPSTORAGE_PLAIN, InvalidOid,
@@ -144,6 +147,43 @@ struct typmap
static List *Typ = NIL; /* List of struct typmap* */
static struct typmap *Ap = NULL;
+/*
+ * Basic information about built-in roles.
+ *
+ * Presently, this need only list roles that are mentioned in aclitem arrays
+ * in the catalog .dat files. We might as well list everything that is in
+ * pg_authid.dat, since there aren't that many. We assume that the bootstrap
+ * superuser's name is "postgres", even though it might not be that in the
+ * finished installation; this means aclitem entries in .dat files must spell
+ * it like that.
+ */
+struct rolinfo
+{
+ const char *rolname;
+ Oid oid;
+};
+
+static const struct rolinfo RolInfo[] = {
+ {"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 = 0; i < lengthof(RolInfo); i++)
+ {
+ if (strcmp(RolInfo[i].rolname, rolname) == 0)
+ return RolInfo[i].oid;
+ }
+ return InvalidOid;
+}
+
/* ----------------
* AllocateAttribute
*
diff --git a/src/backend/catalog/system_functions.sql b/src/backend/catalog/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 them.
--- A number of functions shouldn't be executable by just anyone, but rather
--- than use explicit 'superuser()' checks in those functions, we use the GRANT
--- system to REVOKE access to those functions at initdb time. Administrators
--- 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) FROM public;
-
-REVOKE EXECUTE ON FUNCTION pg_stat_reset_backend_stats(integer) FROM public;
-
-REVOKE EXECUTE ON FUNCTION pg_stat_reset_replication_slot(text) FROM public;
-
-REVOKE EXECUTE ON FUNCTION pg_stat_have_stats(text, oid, int8) FROM public;
-
-REVOKE EXECUTE ON FUNCTION pg_stat_reset_subscription_stats(oid) FROM public;
-
-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 public;
-
-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) FROM 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 public;
-
-REVOKE EXECUTE ON FUNCTION pg_replication_origin_session_setup(text, integer) FROM public;
-
-REVOKE EXECUTE ON FUNCTION pg_replication_origin_xact_reset() FROM public;
-
-REVOKE EXECUTE ON FUNCTION pg_replication_origin_xact_setup(pg_lsn, timestamp with time zone) FROM public;
-
-REVOKE EXECUTE ON FUNCTION pg_show_replication_origin_status() FROM public;
-
-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 PUBLIC;
-
-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/system_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_all_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 <ctype.h>
#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 = ACL_ID_PUBLIC;
else
{
- aip->ai_grantee = get_role_oid(name, true);
+ if (IsBootstrapProcessingMode())
+ aip->ai_grantee = boot_get_role_oid(name);
+ else
+ aip->ai_grantee = 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 = get_role_oid(name2, true);
+ if (IsBootstrapProcessingMode())
+ aip->ai_grantor = boot_get_role_oid(name2);
+ else
+ aip->ai_grantor = 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/bootstrap.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 = \
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.build
index 433bcc908ad..bcc01c87c2e 100644
--- a/src/include/catalog/meson.build
+++ b/src/include/catalog/meson.build
@@ -78,6 +78,7 @@ bki_data = [
'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 => 'pg_read_all_settings', member => 'pg_monitor' },
+{ roleid => 'pg_read_all_stats', member => 'pg_monitor' },
+{ roleid => 'pg_stat_scan_tables', member => 'pg_monitor' },
+
+]
diff --git a/src/include/catalog/pg_auth_members.h b/src/include/catalog/pg_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_ROWTYPE_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_authid.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 => '10', oid_symbol => 'BOOTSTRAP_SUPERUSERID',
rolname => 'POSTGRES', rolsuper => 't', rolinherit => '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 => '764', descr => 'large object import',
proname => 'lo_import', provolatile => 'v', proparallel => 'u',
- prorettype => 'oid', proargtypes => 'text', prosrc => 'be_lo_import' },
+ prorettype => 'oid', proargtypes => 'text', prosrc => 'be_lo_import',
+ proacl => '{postgres=X/postgres}' },
{ oid => '767', descr => 'large object import',
proname => 'lo_import', provolatile => 'v', proparallel => 'u',
prorettype => 'oid', proargtypes => 'text oid',
- prosrc => 'be_lo_import_with_oid' },
+ prosrc => 'be_lo_import_with_oid',
+ proacl => '{postgres=X/postgres}' },
{ oid => '765', descr => 'large object export',
proname => 'lo_export', provolatile => 'v', proparallel => 'u',
- prorettype => 'int4', proargtypes => 'oid text', prosrc => 'be_lo_export' },
+ prorettype => 'int4', proargtypes => 'oid text', prosrc => 'be_lo_export',
+ proacl => '{postgres=X/postgres}' },
{ oid => '766', descr => 'increment',
proname => 'int4inc', prorettype => 'int4', proargtypes => 'int4',
@@ -5709,7 +5712,8 @@
{ oid => '6230', descr => 'statistics: check if a stats object exists',
proname => 'pg_stat_have_stats', provolatile => 'v', proparallel => 'r',
prorettype => 'bool', proargtypes => 'text oid int8',
- prosrc => 'pg_stat_have_stats' },
+ prosrc => 'pg_stat_have_stats',
+ proacl => '{postgres=X/postgres}' },
{ oid => '6231', descr => 'statistics: information about subscription stats',
proname => 'pg_stat_get_subscription_stats', provolatile => 's',
@@ -6170,43 +6174,51 @@
{ oid => '2274',
descr => 'statistics: reset collected statistics for current database',
proname => 'pg_stat_reset', proisstrict => 'f', provolatile => 'v',
- prorettype => 'void', proargtypes => '', prosrc => 'pg_stat_reset' },
+ prorettype => 'void', proargtypes => '', prosrc => 'pg_stat_reset',
+ proacl => '{postgres=X/postgres}' },
{ oid => '3775',
descr => 'statistics: reset collected statistics shared across the cluster',
proname => 'pg_stat_reset_shared', proisstrict => 'f', provolatile => 'v',
prorettype => 'void', proargtypes => 'text',
proargnames => '{target}', proargdefaults => '{NULL}',
- prosrc => 'pg_stat_reset_shared' },
+ prosrc => 'pg_stat_reset_shared',
+ proacl => '{postgres=X/postgres}' },
{ oid => '3776',
descr => 'statistics: reset collected statistics for a single table or index in the current database or shared across all databases in the cluster',
proname => 'pg_stat_reset_single_table_counters', provolatile => 'v',
prorettype => 'void', proargtypes => 'oid',
- prosrc => 'pg_stat_reset_single_table_counters' },
+ prosrc => 'pg_stat_reset_single_table_counters',
+ proacl => '{postgres=X/postgres}' },
{ oid => '3777',
descr => 'statistics: reset collected statistics for a single function in the current database',
proname => 'pg_stat_reset_single_function_counters', provolatile => 'v',
prorettype => 'void', proargtypes => 'oid',
- prosrc => 'pg_stat_reset_single_function_counters' },
+ prosrc => 'pg_stat_reset_single_function_counters',
+ proacl => '{postgres=X/postgres}' },
{ oid => '6387', descr => 'statistics: reset statistics for a single backend',
proname => 'pg_stat_reset_backend_stats', provolatile => 'v',
prorettype => 'void', proargtypes => 'int4',
- prosrc => 'pg_stat_reset_backend_stats' },
+ prosrc => 'pg_stat_reset_backend_stats',
+ proacl => '{postgres=X/postgres}' },
{ oid => '2307',
descr => 'statistics: reset collected statistics for a single SLRU',
proname => 'pg_stat_reset_slru', proisstrict => 'f', provolatile => 'v',
prorettype => 'void', proargtypes => 'text', proargnames => '{target}',
proargdefaults => '{NULL}',
- prosrc => 'pg_stat_reset_slru' },
+ prosrc => 'pg_stat_reset_slru',
+ proacl => '{postgres=X/postgres}' },
{ oid => '6170',
descr => 'statistics: reset collected statistics for a single replication slot',
proname => 'pg_stat_reset_replication_slot', proisstrict => 'f',
provolatile => 'v', prorettype => 'void', proargtypes => 'text',
- prosrc => 'pg_stat_reset_replication_slot' },
+ prosrc => 'pg_stat_reset_replication_slot',
+ proacl => '{postgres=X/postgres}' },
{ oid => '6232',
descr => 'statistics: reset collected statistics for a single subscription',
proname => 'pg_stat_reset_subscription_stats', proisstrict => 'f',
provolatile => 'v', prorettype => 'void', proargtypes => 'oid',
- prosrc => 'pg_stat_reset_subscription_stats' },
+ prosrc => 'pg_stat_reset_subscription_stats',
+ proacl => '{postgres=X/postgres}' },
{ oid => '3163', descr => 'current trigger depth',
proname => 'pg_trigger_depth', provolatile => 's', proparallel => 'r',
@@ -6553,21 +6565,24 @@
proallargtypes => '{text,int4,int4,text,text,bool,text}',
proargmodes => '{o,o,o,o,o,o,o}',
proargnames => '{sourcefile,sourceline,seqno,name,setting,applied,error}',
- prosrc => 'show_all_file_settings' },
+ prosrc => 'show_all_file_settings',
+ proacl => '{postgres=X/postgres}' },
{ oid => '3401', descr => 'show pg_hba.conf rules',
proname => 'pg_hba_file_rules', prorows => '1000', proretset => 't',
provolatile => 'v', prorettype => 'record', proargtypes => '',
proallargtypes => '{int4,text,int4,text,_text,_text,text,text,text,_text,text}',
proargmodes => '{o,o,o,o,o,o,o,o,o,o,o}',
proargnames => '{rule_number,file_name,line_number,type,database,user_name,address,netmask,auth_method,options,error}',
- prosrc => 'pg_hba_file_rules' },
+ prosrc => 'pg_hba_file_rules',
+ proacl => '{postgres=X/postgres}' },
{ oid => '6250', descr => 'show pg_ident.conf mappings',
proname => 'pg_ident_file_mappings', prorows => '1000', proretset => 't',
provolatile => 'v', prorettype => 'record', proargtypes => '',
proallargtypes => '{int4,text,int4,text,text,text,text}',
proargmodes => '{o,o,o,o,o,o,o}',
proargnames => '{map_number,file_name,line_number,map_name,sys_name,pg_username,error}',
- prosrc => 'pg_ident_file_mappings' },
+ prosrc => 'pg_ident_file_mappings',
+ proacl => '{postgres=X/postgres}' },
{ oid => '1371', descr => 'view system lock information',
proname => 'pg_lock_status', prorows => '1000', proretset => 't',
provolatile => 'v', prorettype => 'record', proargtypes => '',
@@ -6737,30 +6752,36 @@
proname => 'pg_backup_start', provolatile => 'v', proparallel => 'r',
prorettype => 'pg_lsn', proargtypes => 'text bool',
proargnames => '{label,fast}', proargdefaults => '{false}',
- prosrc => 'pg_backup_start' },
+ prosrc => 'pg_backup_start',
+ proacl => '{postgres=X/postgres}' },
{ oid => '2739', descr => 'finish taking an online backup',
proname => 'pg_backup_stop', provolatile => 'v', proparallel => 'r',
prorettype => 'record', proargtypes => 'bool',
proallargtypes => '{bool,pg_lsn,text,text}', proargmodes => '{i,o,o,o}',
proargnames => '{wait_for_archive,lsn,labelfile,spcmapfile}',
proargdefaults => '{true}',
- prosrc => 'pg_backup_stop' },
+ prosrc => 'pg_backup_stop',
+ proacl => '{postgres=X/postgres}' },
{ oid => '3436', descr => 'promote standby server',
proname => 'pg_promote', provolatile => 'v', prorettype => 'bool',
proargtypes => 'bool int4', proargnames => '{wait,wait_seconds}',
proargdefaults => '{true,60}',
- prosrc => 'pg_promote' },
+ prosrc => 'pg_promote',
+ proacl => '{postgres=X/postgres}' },
{ oid => '2848', descr => 'switch to new wal file',
proname => 'pg_switch_wal', provolatile => 'v', prorettype => 'pg_lsn',
- proargtypes => '', prosrc => 'pg_switch_wal' },
+ proargtypes => '', prosrc => 'pg_switch_wal',
+ proacl => '{postgres=X/postgres}' },
{ oid => '6305', descr => 'log details of the current snapshot to WAL',
proname => 'pg_log_standby_snapshot', provolatile => 'v',
prorettype => 'pg_lsn', proargtypes => '',
- prosrc => 'pg_log_standby_snapshot' },
+ prosrc => 'pg_log_standby_snapshot',
+ proacl => '{postgres=X/postgres}' },
{ oid => '3098', descr => 'create a named restore point',
proname => 'pg_create_restore_point', provolatile => 'v',
prorettype => 'pg_lsn', proargtypes => 'text',
- prosrc => 'pg_create_restore_point' },
+ prosrc => 'pg_create_restore_point',
+ proacl => '{postgres=X/postgres}' },
{ oid => '2849', descr => 'current wal write location',
proname => 'pg_current_wal_lsn', provolatile => 'v', prorettype => 'pg_lsn',
proargtypes => '', prosrc => 'pg_current_wal_lsn' },
@@ -6816,10 +6837,12 @@
{ oid => '3071', descr => 'pause wal replay',
proname => 'pg_wal_replay_pause', provolatile => 'v', prorettype => 'void',
- proargtypes => '', prosrc => 'pg_wal_replay_pause' },
+ proargtypes => '', prosrc => 'pg_wal_replay_pause',
+ proacl => '{postgres=X/postgres}' },
{ oid => '3072', descr => 'resume wal replay, if it was paused',
proname => 'pg_wal_replay_resume', provolatile => 'v', prorettype => 'void',
- proargtypes => '', prosrc => 'pg_wal_replay_resume' },
+ proargtypes => '', prosrc => 'pg_wal_replay_resume',
+ proacl => '{postgres=X/postgres}' },
{ oid => '3073', descr => 'true if wal replay is paused',
proname => 'pg_is_wal_replay_paused', provolatile => 'v',
prorettype => 'bool', proargtypes => '',
@@ -6845,17 +6868,21 @@
{ oid => '2621', descr => 'reload configuration files',
proname => 'pg_reload_conf', provolatile => 'v', prorettype => 'bool',
- proargtypes => '', prosrc => 'pg_reload_conf' },
+ proargtypes => '', prosrc => 'pg_reload_conf',
+ proacl => '{postgres=X/postgres}' },
{ oid => '2622', descr => 'rotate log file',
proname => 'pg_rotate_logfile', provolatile => 'v', prorettype => 'bool',
- proargtypes => '', prosrc => 'pg_rotate_logfile' },
+ proargtypes => '', prosrc => 'pg_rotate_logfile',
+ proacl => '{postgres=X/postgres}' },
{ oid => '3800', descr => 'current logging collector file location',
proname => 'pg_current_logfile', proisstrict => 'f', provolatile => 'v',
- prorettype => 'text', proargtypes => '', prosrc => 'pg_current_logfile' },
+ prorettype => 'text', proargtypes => '', prosrc => 'pg_current_logfile',
+ proacl => '{postgres=X/postgres,pg_monitor=X/postgres}' },
{ oid => '3801', descr => 'current logging collector file location',
proname => 'pg_current_logfile', proisstrict => 'f', provolatile => 'v',
prorettype => 'text', proargtypes => 'text',
- prosrc => 'pg_current_logfile_1arg' },
+ prosrc => 'pg_current_logfile_1arg',
+ proacl => '{postgres=X/postgres,pg_monitor=X/postgres}' },
{ oid => '2623', descr => 'get information about file',
proname => 'pg_stat_file', provolatile => 'v', prorettype => 'record',
@@ -6863,48 +6890,60 @@
proallargtypes => '{text,int8,timestamptz,timestamptz,timestamptz,timestamptz,bool}',
proargmodes => '{i,o,o,o,o,o,o}',
proargnames => '{filename,size,access,modification,change,creation,isdir}',
- prosrc => 'pg_stat_file_1arg' },
+ prosrc => 'pg_stat_file_1arg',
+ proacl => '{postgres=X/postgres}' },
{ oid => '3307', descr => 'get information about file',
proname => 'pg_stat_file', provolatile => 'v', prorettype => 'record',
proargtypes => 'text bool',
proallargtypes => '{text,bool,int8,timestamptz,timestamptz,timestamptz,timestamptz,bool}',
proargmodes => '{i,i,o,o,o,o,o,o}',
proargnames => '{filename,missing_ok,size,access,modification,change,creation,isdir}',
- prosrc => 'pg_stat_file' },
+ prosrc => 'pg_stat_file',
+ proacl => '{postgres=X/postgres}' },
{ oid => '2624', descr => 'read text from a file',
proname => 'pg_read_file', provolatile => 'v', prorettype => 'text',
- proargtypes => 'text int8 int8', prosrc => 'pg_read_file_off_len' },
+ proargtypes => 'text int8 int8', prosrc => 'pg_read_file_off_len',
+ proacl => '{postgres=X/postgres}' },
{ oid => '3293', descr => 'read text from a file',
proname => 'pg_read_file', provolatile => 'v', prorettype => 'text',
proargtypes => 'text int8 int8 bool',
- prosrc => 'pg_read_file_off_len_missing' },
+ prosrc => 'pg_read_file_off_len_missing',
+ proacl => '{postgres=X/postgres}' },
{ oid => '3826', descr => 'read text from a file',
proname => 'pg_read_file', provolatile => 'v', prorettype => 'text',
- proargtypes => 'text', prosrc => 'pg_read_file_all' },
+ proargtypes => 'text', prosrc => 'pg_read_file_all',
+ proacl => '{postgres=X/postgres}' },
{ oid => '6208', descr => 'read text from a file',
proname => 'pg_read_file', provolatile => 'v', prorettype => 'text',
- proargtypes => 'text bool', prosrc => 'pg_read_file_all_missing' },
+ proargtypes => 'text bool', prosrc => 'pg_read_file_all_missing',
+ proacl => '{postgres=X/postgres}' },
{ oid => '3827', descr => 'read bytea from a file',
proname => 'pg_read_binary_file', provolatile => 'v', prorettype => 'bytea',
- proargtypes => 'text int8 int8', prosrc => 'pg_read_binary_file_off_len' },
+ proargtypes => 'text int8 int8', prosrc => 'pg_read_binary_file_off_len',
+ proacl => '{postgres=X/postgres}' },
{ oid => '3295', descr => 'read bytea from a file',
proname => 'pg_read_binary_file', provolatile => 'v', prorettype => 'bytea',
proargtypes => 'text int8 int8 bool',
- prosrc => 'pg_read_binary_file_off_len_missing' },
+ prosrc => 'pg_read_binary_file_off_len_missing',
+ proacl => '{postgres=X/postgres}' },
{ oid => '3828', descr => 'read bytea from a file',
proname => 'pg_read_binary_file', provolatile => 'v', prorettype => 'bytea',
- proargtypes => 'text', prosrc => 'pg_read_binary_file_all' },
+ proargtypes => 'text', prosrc => 'pg_read_binary_file_all',
+ proacl => '{postgres=X/postgres}' },
{ oid => '6209', descr => 'read bytea from a file',
proname => 'pg_read_binary_file', provolatile => 'v', prorettype => 'bytea',
- proargtypes => 'text bool', prosrc => 'pg_read_binary_file_all_missing' },
+ proargtypes => 'text bool', prosrc => 'pg_read_binary_file_all_missing',
+ proacl => '{postgres=X/postgres}' },
{ oid => '2625', descr => 'list all files in a directory',
proname => 'pg_ls_dir', prorows => '1000', proretset => 't',
provolatile => 'v', prorettype => 'text', proargtypes => 'text',
- prosrc => 'pg_ls_dir_1arg' },
+ prosrc => 'pg_ls_dir_1arg',
+ proacl => '{postgres=X/postgres}' },
{ oid => '3297', descr => 'list all files in a directory',
proname => 'pg_ls_dir', prorows => '1000', proretset => 't',
provolatile => 'v', prorettype => 'text', proargtypes => 'text bool bool',
- prosrc => 'pg_ls_dir' },
+ prosrc => 'pg_ls_dir',
+ proacl => '{postgres=X/postgres}' },
{ oid => '2626', descr => 'sleep for the specified time in seconds',
proname => 'pg_sleep', provolatile => 'v', prorettype => 'void',
proargtypes => 'float8', prosrc => 'pg_sleep' },
@@ -8602,7 +8641,8 @@
provolatile => 'v', prorettype => 'record', proargtypes => '',
proallargtypes => '{text,int8,int8,int8}', proargmodes => '{o,o,o,o}',
proargnames => '{name,off,size,allocated_size}',
- prosrc => 'pg_get_shmem_allocations' },
+ prosrc => 'pg_get_shmem_allocations',
+ proacl => '{postgres=X/postgres,pg_read_all_stats=X/postgres}' },
{ oid => '4099', descr => 'Is NUMA support available?',
proname => 'pg_numa_available', provolatile => 's', prorettype => 'bool',
@@ -8614,7 +8654,8 @@
provolatile => 'v', prorettype => 'record', proargtypes => '',
proallargtypes => '{text,int4,int8}', proargmodes => '{o,o,o}',
proargnames => '{name,numa_node,size}',
- prosrc => 'pg_get_shmem_allocations_numa' },
+ prosrc => 'pg_get_shmem_allocations_numa',
+ proacl => '{postgres=X/postgres,pg_read_all_stats=X/postgres}' },
{ oid => '9314',
descr => 'shared memory allocations tracked in the DSM registry',
@@ -8622,7 +8663,8 @@
proretset => 't', provolatile => 'v', prorettype => 'record',
proargtypes => '', proallargtypes => '{text,text,int8}',
proargmodes => '{o,o,o}', proargnames => '{name,type,size}',
- prosrc => 'pg_get_dsm_registry_allocations' },
+ prosrc => 'pg_get_dsm_registry_allocations',
+ proacl => '{postgres=X/postgres,pg_read_all_stats=X/postgres}' },
# memory context of local backend
{ oid => '2282',
@@ -8633,13 +8675,15 @@
proallargtypes => '{text,text,text,int4,_int4,int8,int8,int8,int8,int8}',
proargmodes => '{o,o,o,o,o,o,o,o,o,o}',
proargnames => '{name, ident, type, level, path, total_bytes, total_nblocks, free_bytes, free_chunks, used_bytes}',
- prosrc => 'pg_get_backend_memory_contexts' },
+ prosrc => 'pg_get_backend_memory_contexts',
+ proacl => '{postgres=X/postgres,pg_read_all_stats=X/postgres}' },
# logging memory contexts of the specified backend
{ oid => '4543', descr => 'log memory contexts of the specified backend',
proname => 'pg_log_backend_memory_contexts', provolatile => 'v',
prorettype => 'bool', proargtypes => 'int4',
- prosrc => 'pg_log_backend_memory_contexts' },
+ prosrc => 'pg_log_backend_memory_contexts',
+ proacl => '{postgres=X/postgres}' },
# non-persistent series generator
{ oid => '1066', descr => 'non-persistent series generator',
@@ -12312,63 +12356,74 @@
{ oid => '6003', descr => 'create a replication origin',
proname => 'pg_replication_origin_create', provolatile => 'v',
proparallel => 'u', prorettype => 'oid', proargtypes => 'text',
- prosrc => 'pg_replication_origin_create' },
+ prosrc => 'pg_replication_origin_create',
+ proacl => '{postgres=X/postgres}' },
{ oid => '6004', descr => 'drop replication origin identified by its name',
proname => 'pg_replication_origin_drop', provolatile => 'v',
proparallel => 'u', prorettype => 'void', proargtypes => 'text',
- prosrc => 'pg_replication_origin_drop' },
+ prosrc => 'pg_replication_origin_drop',
+ proacl => '{postgres=X/postgres}' },
{ oid => '6005',
descr => 'translate the replication origin\'s name to its id',
proname => 'pg_replication_origin_oid', provolatile => 's',
prorettype => 'oid', proargtypes => 'text',
- prosrc => 'pg_replication_origin_oid' },
+ prosrc => 'pg_replication_origin_oid',
+ proacl => '{postgres=X/postgres}' },
{ oid => '6006',
descr => 'configure session to maintain replication progress tracking for the passed in origin',
proname => 'pg_replication_origin_session_setup', provolatile => 'v',
proparallel => 'u', prorettype => 'void', proargtypes => 'text int4',
proargnames => '{node_name,pid}', proargdefaults => '{0}',
- prosrc => 'pg_replication_origin_session_setup' },
+ prosrc => 'pg_replication_origin_session_setup',
+ proacl => '{postgres=X/postgres}' },
{ oid => '6007', descr => 'teardown configured replication progress tracking',
proname => 'pg_replication_origin_session_reset', provolatile => 'v',
proparallel => 'u', prorettype => 'void', proargtypes => '',
- prosrc => 'pg_replication_origin_session_reset' },
+ prosrc => 'pg_replication_origin_session_reset',
+ proacl => '{postgres=X/postgres}' },
{ oid => '6008',
descr => 'is a replication origin configured in this session',
proname => 'pg_replication_origin_session_is_setup', provolatile => 'v',
proparallel => 'r', prorettype => 'bool', proargtypes => '',
- prosrc => 'pg_replication_origin_session_is_setup' },
+ prosrc => 'pg_replication_origin_session_is_setup',
+ proacl => '{postgres=X/postgres}' },
{ oid => '6009',
descr => 'get the replication progress of the current session',
proname => 'pg_replication_origin_session_progress', provolatile => 'v',
proparallel => 'u', prorettype => 'pg_lsn', proargtypes => 'bool',
- prosrc => 'pg_replication_origin_session_progress' },
+ prosrc => 'pg_replication_origin_session_progress',
+ proacl => '{postgres=X/postgres}' },
{ oid => '6010', descr => 'setup the transaction\'s origin lsn and timestamp',
proname => 'pg_replication_origin_xact_setup', provolatile => 'v',
proparallel => 'r', prorettype => 'void', proargtypes => 'pg_lsn timestamptz',
- prosrc => 'pg_replication_origin_xact_setup' },
+ prosrc => 'pg_replication_origin_xact_setup',
+ proacl => '{postgres=X/postgres}' },
{ oid => '6011', descr => 'reset the transaction\'s origin lsn and timestamp',
proname => 'pg_replication_origin_xact_reset', provolatile => 'v',
proparallel => 'r', prorettype => 'void', proargtypes => '',
- prosrc => 'pg_replication_origin_xact_reset' },
+ prosrc => 'pg_replication_origin_xact_reset',
+ proacl => '{postgres=X/postgres}' },
{ oid => '6012', descr => 'advance replication origin to specific location',
proname => 'pg_replication_origin_advance', provolatile => 'v',
proparallel => 'u', prorettype => 'void', proargtypes => 'text pg_lsn',
- prosrc => 'pg_replication_origin_advance' },
+ prosrc => 'pg_replication_origin_advance',
+ proacl => '{postgres=X/postgres}' },
{ oid => '6013',
descr => 'get an individual replication origin\'s replication progress',
proname => 'pg_replication_origin_progress', provolatile => 'v',
proparallel => 'u', prorettype => 'pg_lsn', proargtypes => 'text bool',
- prosrc => 'pg_replication_origin_progress' },
+ prosrc => 'pg_replication_origin_progress',
+ proacl => '{postgres=X/postgres}' },
{ oid => '6014', descr => 'get progress for all replication origins',
proname => 'pg_show_replication_origin_status', prorows => '100',
@@ -12376,7 +12431,8 @@
prorettype => 'record', proargtypes => '',
proallargtypes => '{oid,text,pg_lsn,pg_lsn}', proargmodes => '{o,o,o,o}',
proargnames => '{local_id, external_id, remote_lsn, local_lsn}',
- prosrc => 'pg_show_replication_origin_status' },
+ prosrc => 'pg_show_replication_origin_status',
+ proacl => '{postgres=X/postgres}' },
# publications
{ oid => '6119',
@@ -12414,7 +12470,8 @@
proname => 'pg_config', prorows => '23', proretset => 't', provolatile => 's',
proparallel => 'r', prorettype => 'record', proargtypes => '',
proallargtypes => '{text,text}', proargmodes => '{o,o}',
- proargnames => '{name,setting}', prosrc => 'pg_config' },
+ proargnames => '{name,setting}', prosrc => 'pg_config',
+ proacl => '{postgres=X/postgres}' },
# pg_controldata related functions
{ oid => '3441',
@@ -12489,49 +12546,57 @@
proname => 'pg_ls_logdir', procost => '10', prorows => '20', proretset => 't',
provolatile => 'v', prorettype => 'record', proargtypes => '',
proallargtypes => '{text,int8,timestamptz}', proargmodes => '{o,o,o}',
- proargnames => '{name,size,modification}', prosrc => 'pg_ls_logdir' },
+ proargnames => '{name,size,modification}', prosrc => 'pg_ls_logdir',
+ proacl => '{postgres=X/postgres,pg_monitor=X/postgres}' },
{ oid => '3354', descr => 'list of files in the WAL directory',
proname => 'pg_ls_waldir', procost => '10', prorows => '20', proretset => 't',
provolatile => 'v', prorettype => 'record', proargtypes => '',
proallargtypes => '{text,int8,timestamptz}', proargmodes => '{o,o,o}',
- proargnames => '{name,size,modification}', prosrc => 'pg_ls_waldir' },
+ proargnames => '{name,size,modification}', prosrc => 'pg_ls_waldir',
+ proacl => '{postgres=X/postgres,pg_monitor=X/postgres}' },
{ oid => '6400', descr => 'list of files in the pg_wal/summaries directory',
proname => 'pg_ls_summariesdir', procost => '10', prorows => '20',
proretset => 't', provolatile => 'v', prorettype => 'record',
proargtypes => '', proallargtypes => '{text,int8,timestamptz}',
proargmodes => '{o,o,o}', proargnames => '{name,size,modification}',
- prosrc => 'pg_ls_summariesdir' },
+ prosrc => 'pg_ls_summariesdir',
+ proacl => '{postgres=X/postgres,pg_monitor=X/postgres}' },
{ oid => '5031', descr => 'list of files in the archive_status directory',
proname => 'pg_ls_archive_statusdir', procost => '10', prorows => '20',
proretset => 't', provolatile => 'v', prorettype => 'record',
proargtypes => '', proallargtypes => '{text,int8,timestamptz}',
proargmodes => '{o,o,o}', proargnames => '{name,size,modification}',
- prosrc => 'pg_ls_archive_statusdir' },
+ prosrc => 'pg_ls_archive_statusdir',
+ proacl => '{postgres=X/postgres,pg_monitor=X/postgres}' },
{ oid => '5029', descr => 'list files in the pgsql_tmp directory',
proname => 'pg_ls_tmpdir', procost => '10', prorows => '20', proretset => 't',
provolatile => 'v', prorettype => 'record', proargtypes => '',
proallargtypes => '{text,int8,timestamptz}', proargmodes => '{o,o,o}',
- proargnames => '{name,size,modification}', prosrc => 'pg_ls_tmpdir_noargs' },
+ proargnames => '{name,size,modification}', prosrc => 'pg_ls_tmpdir_noargs',
+ proacl => '{postgres=X/postgres,pg_monitor=X/postgres}' },
{ oid => '5030', descr => 'list files in the pgsql_tmp directory',
proname => 'pg_ls_tmpdir', procost => '10', prorows => '20', proretset => 't',
provolatile => 'v', prorettype => 'record', proargtypes => 'oid',
proallargtypes => '{oid,text,int8,timestamptz}', proargmodes => '{i,o,o,o}',
proargnames => '{tablespace,name,size,modification}',
- prosrc => 'pg_ls_tmpdir_1arg' },
+ prosrc => 'pg_ls_tmpdir_1arg',
+ proacl => '{postgres=X/postgres,pg_monitor=X/postgres}' },
{ oid => '6270',
descr => 'list of files in the pg_logical/snapshots directory',
proname => 'pg_ls_logicalsnapdir', procost => '10', prorows => '20',
proretset => 't', provolatile => 'v', prorettype => 'record',
proargtypes => '', proallargtypes => '{text,int8,timestamptz}',
proargmodes => '{o,o,o}', proargnames => '{name,size,modification}',
- prosrc => 'pg_ls_logicalsnapdir' },
+ prosrc => 'pg_ls_logicalsnapdir',
+ proacl => '{postgres=X/postgres,pg_monitor=X/postgres}' },
{ oid => '6271',
descr => 'list of files in the pg_logical/mappings directory',
proname => 'pg_ls_logicalmapdir', procost => '10', prorows => '20',
proretset => 't', provolatile => 'v', prorettype => 'record',
proargtypes => '', proallargtypes => '{text,int8,timestamptz}',
proargmodes => '{o,o,o}', proargnames => '{name,size,modification}',
- prosrc => 'pg_ls_logicalmapdir' },
+ prosrc => 'pg_ls_logicalmapdir',
+ proacl => '{postgres=X/postgres,pg_monitor=X/postgres}' },
{ oid => '6272',
descr => 'list of files in the pg_replslot/slot_name directory',
proname => 'pg_ls_replslotdir', procost => '10', prorows => '20',
@@ -12539,7 +12604,8 @@
proargtypes => 'text', proallargtypes => '{text,text,int8,timestamptz}',
proargmodes => '{i,o,o,o}',
proargnames => '{slot_name,name,size,modification}',
- prosrc => 'pg_ls_replslotdir' },
+ prosrc => 'pg_ls_replslotdir',
+ proacl => '{postgres=X/postgres,pg_monitor=X/postgres}' },
# hash partitioning constraint function
{ oid => '5028', descr => 'hash partition CHECK constraint',
@@ -12702,7 +12768,8 @@
proallargtypes => '{int4,int4,int8,text,text,int8,int8,text,int2,int4,text,text,bool,bool,bool}',
proargmodes => '{o,o,o,o,o,o,o,o,o,o,o,o,o,o,o}',
proargnames => '{pid,io_id,io_generation,state,operation,off,length,target,handle_data_len,raw_result,result,target_desc,f_sync,f_localmem,f_buffered}',
- prosrc => 'pg_get_aios' },
+ prosrc => 'pg_get_aios',
+ proacl => '{postgres=X/postgres,pg_read_all_stats=X/postgres}' },
# oid8 related functions
{ oid => '8255', descr => 'convert oid to oid8',
--
2.43.7