pg.ddx.io  pgsql-committers@postgresql.org mailing list archive  
help / color / mirror / Atom feed
pgsql: Simplify creation of built-in functions with default arguments.
2+ messages / 1 participants
[nested] [flat]

* pgsql: Simplify creation of built-in functions with default arguments.
@ 2026-02-18 19:14  Tom Lane <tgl@sss.pgh.pa.us>
  0 siblings, 0 replies; 2+ messages in thread

From: Tom Lane @ 2026-02-18 19:14 UTC (permalink / raw)
  To: pgsql-committers@lists.postgresql.org

Simplify creation of built-in functions with default arguments.

Up to now, to create such a function, one had to make a pg_proc.dat
entry and then overwrite it with a CREATE OR REPLACE command in
system_functions.sql.  That's error-prone (cf. bug #19409) and
results in leaving dead rows in the initial contents of pg_proc.

Manual maintenance of pg_node_tree strings seems entirely impractical,
and parsing expressions during bootstrap would be extremely difficult
as well.  But Andres Freund observed that all the current use-cases
are simple constants, and building a Const node is well within the
capabilities of bootstrap mode.  So this patch invents a special case:
if bootstrap mode is asked to ingest a non-null value for
pg_proc.proargdefaults (which would otherwise fail in
pg_node_tree_in), it parses the value as an array literal and then
feeds the element strings to the input functions for the corresponding
parameter types.  Then we can build a suitable pg_node_tree string
with just a few more lines of code.

This allows removing all the system_functions.sql entries that are
just there to set up default arguments, replacing them with
proargdefaults fields in pg_proc.dat entries.  The old technique
remains available in case someone needs a non-constant default.

The initial contents of pg_proc are demonstrably the same after
this patch, except that (1) json_strip_nulls and jsonb_strip_nulls
now have the correct provolatile setting, as per bug #19409;
(2) pg_terminate_backend, make_interval, and drandom_normal
now have defaults that don't include a type coercion, which is
how they should have been all along.

In passing, remove some unused entries from bootstrap.c's TypInfo[]
array.  I had to add some new ones because we'll now need an entry for
each default-possessing system function parameter, but we shouldn't
carry more than we need there; it's just a maintenance gotcha.

Bug: #19409
Reported-by: Lucio Chiessi <lucio.chiessi@trustly.com>
Author: Tom Lane <tgl@sss.pgh.pa.us>
Author: Andrew Dunstan <andrew@dunslane.net>
Reviewed-by: Andres Freund <andres@anarazel.de>
Discussion: https://postgr.es/m/183292bb-4891-4c96-a3ca-e78b5e0e1358@dunslane.net
Discussion: https://postgr.es/m/19409-e16cd2605e59a4af@postgresql.org

Branch
------
master

Details
-------
https://git.postgresql.org/pg/commitdiff/759b03b24ce96f0ba6d734b570d1a6f4a0fb1177

Modified Files
--------------
doc/src/sgml/bki.sgml                    |  34 +++-
src/backend/bootstrap/bootstrap.c        | 177 ++++++++++++++++---
src/backend/catalog/system_functions.sql | 283 +------------------------------
src/backend/utils/cache/lsyscache.c      |   4 +-
src/include/bootstrap/bootstrap.h        |   3 +-
src/include/catalog/catversion.h         |   2 +-
src/include/catalog/pg_proc.dat          |  86 ++++++++--
7 files changed, 263 insertions(+), 326 deletions(-)



^ permalink  raw  reply  [nested|flat] 2+ messages in thread

* pgsql: Simplify creation of built-in functions with non-default ACLs.
@ 2026-03-05 22:43  Tom Lane <tgl@sss.pgh.pa.us>
  0 siblings, 0 replies; 2+ messages in thread

From: Tom Lane @ 2026-03-05 22:43 UTC (permalink / raw)
  To: pgsql-committers@lists.postgresql.org

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.

To create a built-in function with a non-default ACL, one should write
the desired ACL list in its pg_proc.dat entry, using a simplified
version of aclitemout's notation: omit the grantor (if it is the
bootstrap superuser, which it pretty much always should be) and spell
the bootstrap superuser's name as POSTGRES, similarly to the notation
used elsewhere in src/include/catalog.  This results in entries like

  proacl => '{POSTGRES=X,pg_monitor=X}'

which shows that we've revoked public execute permissions and instead
granted that to pg_monitor.

In addition to fixing up pg_proc.dat entries, I got rid of some
role grants that had been stuck into system_functions.sql,
and instead put them into a new file pg_auth_members.dat;
that seems like a far less random place to put the information.

The correctness of the data changes can be verified by comparing the
initial contents of pg_proc and pg_auth_members before and after.
pg_proc should match exactly, but the OID column of pg_auth_members
will probably be different because those OIDs now get assigned a
little earlier in bootstrap.  (I forced a catversion bump out of
caution, but it wasn't really necessary.)

Author: Tom Lane <tgl@sss.pgh.pa.us>
Reviewed-by: Álvaro Herrera <alvherre@kurilemu.de>
Discussion: https://postgr.es/m/183292bb-4891-4c96-a3ca-e78b5e0e1358@dunslane.net

Branch
------
master

Details
-------
https://git.postgresql.org/pg/commitdiff/f95d73ed433207c4323802dc96e52f3e5553a86c

Modified Files
--------------
src/backend/bootstrap/bootstrap.c        |  59 +++++++++
src/backend/catalog/system_functions.sql | 166 +------------------------
src/backend/catalog/system_views.sql     |  19 +--
src/backend/utils/adt/acl.c              |  26 ++--
src/include/bootstrap/bootstrap.h        |   2 +
src/include/catalog/Makefile             |   1 +
src/include/catalog/catversion.h         |   2 +-
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        |   6 +-
src/include/catalog/pg_proc.dat          | 201 ++++++++++++++++++++-----------
12 files changed, 268 insertions(+), 262 deletions(-)



^ permalink  raw  reply  [nested|flat] 2+ messages in thread


end of thread, other threads:[~2026-03-05 22:43 UTC | newest]

Thread overview: 2+ messages (download: mbox mbox.gz follow: Atom feed)
-- links below jump to the message on this page --
2026-02-18 19:14 pgsql: Simplify creation of built-in functions with default arguments. Tom Lane <tgl@sss.pgh.pa.us>
2026-03-05 22:43 pgsql: Simplify creation of built-in functions with non-default ACLs. Tom Lane <tgl@sss.pgh.pa.us>

This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox