Re: Support logical replication of DDLs
Amit Kapila <amit.kapila16@gmail.com>
From: Amit Kapila <amit.kapila16@gmail.com>
To: Bruce Momjian <bruce@momjian.us>
Cc: Masahiko Sawada <sawada.mshk@gmail.com>,
Vitaly Davydov <v.davydov@postgrespro.ru>, pgsql-hackers@lists.postgresql.org
Date: 2026-02-16T09:54:16Z
Lists: pgsql-hackers, pgsql-general
On Fri, Feb 13, 2026 at 3:42 AM Bruce Momjian <bruce@momjian.us> wrote: > > On Wed, Feb 4, 2026 at 04:39:38PM +0900, Masahiko Sawada wrote: > > On Tue, Feb 3, 2026 at 1:04 AM Vitaly Davydov <v.davydov@postgrespro.ru> wrote: > > > 4. Another option is to create json/ddl-sql from system catalog changes without > > > an intermediate representation, but, anyway, when we interpret system catalog > > > changes we have to temporary save current data in some structures. Parsenodes > > > is the already existing solution for it. > > > > IIUC, one of the main challenges of the "deparsing DDL parse tree" > > idea is the maintenance burden. If we implement logic to deparse parse > > nodes back to SQL text, we would end up updating that deparsing code > > every time the underlying parse node definition changes (which happens > > frequently in internal structures). This introduces a substantial and > > ongoing maintenance cost. > > I agree maintenance is the big blocker, but the maintenance is two > parts: > > 1. writing the patch to adjust for new features in each major release > 2. testing the patch > > People create some strange database schemas, so testing will be > difficult. > > pg_upgrade had a similar challenge, and I found that pushing as much of > the changes _out_ of pg_upgrade and to other parts of the system, e.g,, > pg_dump, was a big help. I am not sure if that is possible for > replicated DDL, but if it is, I would pursue it. > The other reason to pursue a deparsing approach is to allow "Schema and Object Redirection" between source and target. For example, users may want to redirect operations from a source object (e.g., HR.ACCOUNTS on the source) to a different target object (e.g., HR_BACKUP.ACCT on the target). Many people in the past supported such flexibility in DDL replication which is one of the reasons we pursued a deparsing approach in the past though that project/approach is paused for the time being. I admit that there were many unresolved challenges apart from the maintenance part of that approach. Personally, I think it is better to first finish initial sync of DDLs as previously proposed in thread [1]. That part is independently useful and would be a good base step for the incremental replication as discussed here. For example, users don't need to worry whether their ALTER's will be replicated without an ERROR. OTOH, initial sync of schema prevents users from snapshot related problems during initial data transfer during set up of subscriber. Now, users need to use pg_dump/restore kind of functionality to do initial setup between publisher and subscriber then start replication. If there are more DDLs ini-between those steps then the initial copy may turn out to be not useful. Additionally, initial sync could be useful in a number of other cases: (a) Many times one needs a clone of the production schema to run tests against, (b) Sometimes users want to run heavy, complex reporting queries without slowing down the main application. So, one can clone required tables and start such reporting queries, (c) In cases like (b), many times, users may not want incremental sync that drops the index as it could be required for reporting purposes. [1]: https://www.postgresql.org/message-id/db02e6773adb4dbcb5b9bb3803ebe340%40amazon.com -- With Regards, Amit Kapila.
Commits
Same data as JSON:
GET /api/v1/messages/:b64id/commits
the thread's linked commits as JSON, with link sources.
API reference →
-
Add a run_as_owner option to subscriptions.
- 482675987bcd 16.0 cited
-
Refactor pgoutput_change().
- da324d6cd45b 16.0 cited
-
Print the correct aliases for DML target tables in ruleutils.
- df931e9ab35b 11.20 landed
- c8a5f1685fb7 15.3 landed
- 4efb4f0d4878 13.11 landed
- 3dd287c14fac 12.15 landed
- 393430f57544 16.0 landed
- 14345f3c6a7b 14.8 landed
-
Fix object identity string for transforms
- 9a312562314a 16.0 landed
-
Add grantable MAINTAIN privilege and pg_maintain role.
- 60684dd834a2 16.0 cited
-
Get rid of recursion-marker values in enum AlterTableType
- 840ff5f451cd 16.0 cited
-
Release cache tuple when no longer needed
- ed0fbc8e5ac9 15.0 cited
-
Empty search_path in logical replication apply worker and walsender.
- 11da97024abb 14.0 cited
-
Refactor format_type APIs to be more modular
- a26116c6cbf4 11.0 cited
-
Use wrappers of PG_DETOAST_DATUM_PACKED() more.
- 3a0d473192b2 10.0 cited