Re: [PATCH] Add pg_get_database_ddl() function to reconstruct CREATE DATABASE statement

From: Quan Zongliang <quanzongliang(at)yeah(dot)net>
To: Akshay Joshi <akshay(dot)joshi(at)enterprisedb(dot)com>, pgsql-hackers <pgsql-hackers(at)postgresql(dot)org>
Subject: Re: [PATCH] Add pg_get_database_ddl() function to reconstruct CREATE DATABASE statement
Date: 2025-11-13 04:17:35
Message-ID: d6a8bb90-9b55-4124-8c80-b5a5c1ee460c@yeah.net
Views: Whole Thread | Raw Message | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

On 11/12/25 8:04 PM, Akshay Joshi wrote:
> Hi Hackers,
>
> I’m submitting a patch as part of the broader Retail DDL Functions
> project described by Andrew Dunstan https://www.postgresql.org/message-
> id/945db7c5-be75-45bf-b55b-cb1e56f2e3e9%40dunslane.net <https://
> www.postgresql.org/message-id/945db7c5-be75-45bf-b55b-
> cb1e56f2e3e9%40dunslane.net>
>
> This patch adds a new system function pg_get_database_ddl(database_name/
> database_oid, pretty), which reconstructs the CREATE DATABASE statement
> for a given database name or database oid. When the pretty flag is set
> to true, the function returns a neatly formatted, multi-line DDL
> statement instead of a single-line statement.
>
> *Usage examples:*
>
> 1) SELECT pg_get_database_ddl('test_get_database_ddl_builtin');  --
> *non-pretty formatted DDL*
>
>
> pg_get_database_ddl
> -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
>   CREATE DATABASE test_get_database_ddl_builtin WITH OWNER =
> regress_ddl_database ENCODING = "UTF8" LC_COLLATE = "C" LC_CTYPE = "C"
> BUILTIN_LOCALE = "C.UTF-8" COLLATION_VERSION = "1" LOCALE_PROVIDER =
> 'builtin' TABLESPACE = pg_default ALLOW_CONNECTIONS = true CONNECTION
> LIMIT = -1;
>
>
> 2) SELECT pg_get_database_ddl('test_get_database_ddl_builtin', true);
> -- *pretty formatted DDL*
>
> CREATE DATABASE test_get_database_ddl_builtin
>          WITH
>          OWNER = regress_ddl_database
>          ENCODING = "UTF8"
>          LC_COLLATE = "C"
>          LC_CTYPE = "C"
>          BUILTIN_LOCALE = "C.UTF-8"
>          COLLATION_VERSION = "1"
>          LOCALE_PROVIDER = 'builtin'
>          TABLESPACE = pg_default
>          ALLOW_CONNECTIONS = true
>          CONNECTION LIMIT = -1;
>
> 3) SELECT pg_get_database_ddl(16835);      -- *non-pretty formatted DDL
> for OID*
> 4) SELECT pg_get_database_ddl(16835, true);  -- *pretty formatted DDL
> for OID*
>
> The patch includes documentation, in-code comments, and regression
> tests, all of which pass successfully.
> *
> **Note:* To run the regression tests, particularly the pg_upgrade tests
> successfully, I had to add a helper function, ddl_filter (in
> database.sql), which removes locale and collation-related information
> from the pg_get_database_ddl output.
>
I think we should check the connection permissions here. Otherwise:

postgres=> SELECT pg_database_size('testdb');
ERROR: permission denied for database testdb
postgres=> SELECT pg_get_database_ddl('testdb');

pg_get_database_ddl
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
CREATE DATABASE testdb WITH OWNER = quanzl ENCODING = "UTF8"
LC_COLLATE = "zh_CN.UTF-8" LC_CTYPE = "zh_CN.UTF-8" LOCALE_PROVIDER =
'libc' TABLESPACE = pg_default ALLOW_CONNECTIONS = true CONNECTION LIMIT
= -1;
(1 row)

Users without connection permissions should not generate DDL.

Regards,
Quan Zongliang

> -----
> Regards,
> Akshay Joshi
> EDB (EnterpriseDB)
>
>
>

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Amit Kapila 2025-11-13 04:18:57 Re: Newly created replication slot may be invalidated by checkpoint
Previous Message Michael Paquier 2025-11-13 04:05:33 Re: [Patch] Windows relation extension failure at 2GB and 4GB