RE: Support logical replication of DDLs
Zhijie Hou (Fujitsu) <houzj.fnst@fujitsu.com>
From: "houzj.fnst@fujitsu.com" <houzj.fnst@fujitsu.com>
To: Amit Kapila <amit.kapila16@gmail.com>, Ajin Cherian <itsajin@gmail.com>
Cc: Peter Smith <smithpb2250@gmail.com>, vignesh C <vignesh21@gmail.com>, Zheng Li <zhengli10@gmail.com>, li jie <ggysxcq@gmail.com>, Dilip Kumar <dilipbalaut@gmail.com>, Alvaro Herrera <alvherre@alvh.no-ip.org>, Masahiko
Sawada <sawada.mshk@gmail.com>, Japin Li <japinli@hotmail.com>, rajesh
singarapu <rajesh.rs0541@gmail.com>, PostgreSQL Hackers <pgsql-hackers@lists.postgresql.org>
Date: 2023-02-19T14:54:40Z
Lists: pgsql-hackers
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
Attachments
- v71-0008-Allow-replicated-objects-to-have-the-same-owner-.patch (application/octet-stream) patch v71-0008
- v71-0001-Infrastructure-to-support-DDL-deparsing.patch (application/octet-stream) patch v71-0001
- v71-0002-Functions-to-deparse-Table-DDL-commands.patch (application/octet-stream) patch v71-0002
- v71-0003-Support-DDL-deparse-of-the-rest-commands.patch (application/octet-stream) patch v71-0003
- v71-0004-Introduce-the-test_ddl_deparse_regress-test-modu.patch (application/octet-stream) patch v71-0004
- v71-0005-DDL-messaging-infrastructure-for-DDL-replication.patch (application/octet-stream) patch v71-0005
- v71-0006-Support-DDL-replication.patch (application/octet-stream) patch v71-0006
- v71-0007-Document-DDL-replication-and-DDL-deparser.patch (application/octet-stream) patch v71-0007
On Tues, Feb 14, 2023 at 19:02 PM Amit Kapila <amit.kapila16@gmail.com> wrote:
> On Fri, Feb 10, 2023 at 4:36 PM Amit Kapila <amit.kapila16@gmail.com> wrote:
> >
> > On Thu, Feb 9, 2023 at 3:25 PM Ajin Cherian <itsajin@gmail.com> wrote:
> > >
> >
> > Comments on 0001 and 0002
> > =======================
> >
>
> Few more comments on 0001 and 0003
Thanks for your comments.
> ===============================
> 1. I think having 'internal' in an exposed function
> pg_get_viewdef_internal() seems a bit odd to me. Shall we name it
> something like pg_get_viewdef_sys() as it consults the system cache?
I think it might be better to rename these to pg_get_xxxdef_string(). Because we used these style in some existing functions(e.g. pg_get_statisticsobjdef_string, pg_get_indexdef_string, pg_get_partconstrdef_string).
So renamed pg_get_viewdef_internal to pg_get_viewdef_string.
> 2. In pg_get_trigger_whenclause(), there are various things that have
> changed in the new code but the patch didn't update those. It is
> important to update those especially because it replaces the existing
> code as well. For example, it should use GET_PRETTY_FLAGS for
> prettyFlags, then some variables are not initialized, and also didn't
> use rellockmode for old and new rtes. I suggest carefully comparing
> the code with the corresponding existing code in the function
> pg_get_triggerdef_worker().
Make sense. According to the current function pg_get_triggerdef_worker, updated the function pg_get_trigger_whenclause.
> 3.
> deparse_CreateTrigStmt
> {
> ...
> +
> + if (node->deferrable)
> + list = lappend(list, new_string_object("DEFERRABLE")); if
> + (node->initdeferred) list = lappend(list,
> + new_string_object("INITIALLY DEFERRED")); append_array_object(ret,
> + "%{constraint_attrs: }s", list);
> ...
> }
>
> Is there a reason that the above part of the conditions doesn't match
> the below conditions in pg_get_triggerdef_worker()?
> pg_get_triggerdef_worker()
> {
> ...
> if (!trigrec->tgdeferrable)
> appendStringInfoString(&buf, "NOT ");
> appendStringInfoString(&buf, "DEFERRABLE INITIALLY "); if
> (trigrec->tginitdeferred) appendStringInfoString(&buf, "DEFERRED ");
> else appendStringInfoString(&buf, "IMMEDIATE "); ...
> }
Modified deparse_CreateTrigStmt to be consistent with pg_get_trigger_whenclause.
> 4. In deparse_CreateTrigStmt(), the handling for REFERENCING OLD/NEW
> Table is missing. See the corresponding code in
> pg_get_triggerdef_worker().
Added.
> 5. In deparse_CreateTrigStmt(), the function name for EXECUTE
> PROCEDURE is generated in a different way as compared to what we are
> doing in pg_get_triggerdef_worker(). Is there a reason for the same?
I think the approach used in the function pg_get_triggerdef_worker sometimes doesn't include the schema name and returns the string directly (see function generate_function_name). And I think the approach used in the function deparse_CreateTrigStmt always includes the schema name and returns the ObjTree type result we need. So I think the current approach looks fine.
> 6.
> +char *
> +pg_get_partkeydef_simple(Oid relid)
> +{
> + return pg_get_partkeydef_worker(relid, 0, false, false); }
>
> The 0 is not a valid value for prettyFlags, so not sure what is the
> intention here. I think you need to use GET_PRETTY_FLAGS() here.
>
> 7. The above comment applies to pg_get_constraintdef_command_simple()
> as well.
Change '0' to 'GET_PRETTY_FLAGS(false)'.
> 8. Can we think of better names instead of appending 'simple' in the
> above two cases?
Renamed pg_get_partkeydef_simple to pg_get_partkeydef_string.
Renamed pg_get_constraintdef_command_simple to pg_get_constraintdef_string.
Attach the new version patchset. The 0001,0002,0003,0004,0006,0008 patches
were modified, and the details are as follows:
The following changes have been made to the patch set:
1. The comments by Amit in [1] were addressed in patches 0001, 0002 and 0003.
2. The comments by Sawada and Amit in [2] were addressed in patches 0002 and 0006.
3. The comments by Alvaro in [1] were addressed in patches 0001, 0003 and 0008.
4. Removed redundant function calls (append_bool_object(tmp, "present", true);) in the function deparse_DefineStmt_Aggregate introduced in patch v70-0003-*. In addition, modify the expected results of related tests in patch 0004.
[1] - https://www.postgresql.org/message-id/CAA4eK1%2BpdyQoYB4R5rzrxZjz2dNWW1p2iqAj7J9qWeTvKDyBiQ%40mail.gmail.com
[2] - https://www.postgresql.org/message-id/CAA4eK1J2voRVoYBB%3Dr4xtdzYTSPX7RnTcvXyYLk031YE6gWxKg%40mail.gmail.com
[3] - https://www.postgresql.org/message-id/20230216180200.4shhjmuzhdb24nh6%40alvherre.pgsql
Best Regards,
Hou zj