From: | Petr Jelinek <petr(dot)jelinek(at)2ndquadrant(dot)com> |
---|---|
To: | Marco Nenciarini <marco(dot)nenciarini(at)2ndquadrant(dot)it>, Simon Riggs <simon(at)2ndquadrant(dot)com> |
Cc: | PostgreSQL-development <pgsql-hackers(at)postgresql(dot)org> |
Subject: | Re: [PATCH] Logical decoding of TRUNCATE |
Date: | 2018-01-17 17:07:31 |
Message-ID: | f45ec6eb-1dda-9b7f-6fb8-85deb40ff968@2ndquadrant.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-general pgsql-hackers |
Hi,
I reviewed 0001 in its own thread.
So I think that we generally want this patch and I think the design
decisions are right. Namely:
TRUNCATE being treated as DELETE in terms of DML filtering makes sense
to me as it is basically bulk delete, needs to be mentioned in release
notes though.
Adding special message to protocol is appropriate as truncate is more
DML than DDL in sense of manipulating data so it should be replicated
separately from other DDL
Processing relations that were truncated when CASCADE is used separately
is needed because we allow relations to be filtered by logical replication
I see the patch adds new xlog record which is perhaps not ideal but the
current one seems utterly unsuitable for decoding so I guess it's okay,
especially when it's only added for wal_level = logical which it is.
Also TRUNCATE is not exactly high tps operation.
Things I am less convinced about:
The patch will cascade truncation on downstream if cascade was specified
on the upstream, that can potentially be dangerous and we either should
not do it and only truncate the tables which were truncated upstream
(but without restricting because of FKs), leaving the data inconsistent
on downstream (like we do already with DELETE or UPDATE). Or maybe make
it into either subscription or publication option so that user can chose
the behaviour here as I am sure some people will want it to cascade (but
the default should still IMHO be to not cascade as that's safer).
> + /* logicalrep_rel_close call not needed, because ExecuteTruncateGuts
> + * already closes the relations. Setting localrel to NULL in the map entry
> + * is still needed.
> + */
> + rel->localrel = NULL;
This is somewhat ugly. Perhaps the ExecuteTruncateGuts should track
which relations it opened and only close those and the rest should be
closed by caller? That should also remove the other ugly part which is
that the ExecuteTruncateGuts modifies the input list. What if caller
wanted to use those relations it sent as parameter later?
--
Petr Jelinek http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services
From | Date | Subject | |
---|---|---|---|
Next Message | Tom Lane | 2018-01-17 17:16:19 | Re: ERROR: unexpected chunk number 0 (expected 1) for toast value 76753264 in pg_toast_10920100 |
Previous Message | Melvin Davidson | 2018-01-17 16:04:24 | Re: READ COMMITTED vs. index-only scans |
From | Date | Subject | |
---|---|---|---|
Next Message | Peter Geoghegan | 2018-01-17 17:27:10 | Re: [HACKERS] Parallel tuplesort (for parallel B-Tree index creation) |
Previous Message | Tom Lane | 2018-01-17 16:59:41 | Re: Unnecessary static variable? |