Re: row filtering for logical replication
Craig Ringer <craig@2ndquadrant.com>
Commits
GET /api/v1/messages/:b64id/commits
the thread's linked commits as JSON, with link sources.
API reference →
-
Release cache tuple when no longer needed
- ed0fbc8e5ac9 15.0 landed
-
Add some additional tests for row filters in logical replication.
- ceb57afd3ce1 15.0 landed
-
Fix one of the tests introduced in commit 52e4f0cd47.
- cfb4e209ec15 15.0 landed
-
Allow specifying row filters for logical replication of tables.
- 52e4f0cd472d 15.0 landed
-
Move scanint8() to numutils.c
- cfc7191dfea3 15.0 cited
-
Replace Test::More plans with done_testing
- 549ec201d613 15.0 cited
-
Reduce relcache access in WAL sender streaming logical changes
- 6ce16088bfed 15.0 cited
-
Small cleanups related to PUBLICATION framework code
- c9105dd3660f 15.0 cited
-
Add a view to show the stats of subscription workers.
- 8d74fc96db5f 15.0 cited
-
Allow publishing the tables of schema.
- 5a2832465fd8 15.0 cited
-
Doc: improve documentation of CREATE/ALTER SUBSCRIPTION.
- 1882d6cca161 15.0 cited
-
Add PublicationTable and PublicationRelInfo structs
- 0c6828fa987b 15.0 cited
-
Remove unused argument "txn" in maybe_send_schema().
- 93d573d86571 15.0 cited
-
Add prepare API support for streaming transactions in logical replication.
- 63cf61cdeb7b 15.0 cited
-
Unify PostgresNode's new() and get_new_node() methods
- 201a76183e20 15.0 cited
-
Use l*_node() family of functions where appropriate
- 2b00db4fb0c7 15.0 cited
-
Add support for prepared transactions to built-in logical replication.
- a8fd13cab0ba 15.0 cited
-
Restore the portal-level snapshot after procedure COMMIT/ROLLBACK.
- ef9480509622 11.13 cited
-
Rename a parse node to be more general
- 91d1f2d30210 14.0 landed
-
Remove unused column atttypmod from initial tablesync query
- 4ad31bb2ef25 14.0 landed
-
SEARCH and CYCLE clauses
- 3696a600e229 14.0 cited
On Fri, 17 Jan 2020 at 07:58, Euler Taveira <euler@timbira.com.br> wrote: > > Em qui., 16 de jan. de 2020 às 18:57, Tomas Vondra > <tomas.vondra@2ndquadrant.com> escreveu: > > > > Euler, this patch is still in "waiting on author" since 11/25. Do you > > plan to review changes made by Amit in the patches he submitted, or what > > are your plans with this patch? > > > Yes, I'm working on Amit suggestions. I'll post a new patch as soon as possible. Great. I think this'd be nice to see. Were you able to fully address the following points that came up in the discussion? * Make sure row filters cannot access non-catalog, non-user-catalog relations i.e. can only use RelationIsAccessibleInLogicalDecoding rels * Prevent filters from attempting to access attributes that may not be WAL-logged in a given change record, or give them a way to test for this. Unchanged TOASTed atts are not logged. There's also REPLICA IDENTITY FULL to consider if exposing access to the old tuple in the filter. Also, while I'm not sure if it was raised earlier, experience with row filtering in pglogical has shown that error handling is challenging. Because row filters are read from a historic snapshot of the catalogs you cannot change them or any SQL or plpgsql functions they use if a problem causes an ERROR when executing the filter expression. You can fix the current snapshot's definition but the decoding session won't see it and will continue to ERROR. We don't really have a good answer for that yet in pglogical; right now you have to either intervene with low level tools or drop the subscription and re-create it. Neither of which is ideal. You can't just read the row filter from the current snapshot as the relation definition (atts etc) may not match. Plus that creates a variety of issues with which txns get which version of a row filter applied during decoding, consistency between multiple subscribers, etc. One option I've thought about was a GUC that allows users to specify what should be done for errors in row filter expressions: drop the row as if the filter rejected it; pass the row as if the filter matched; propagate the ERROR and end the decoding session (default). I'd welcome ideas about this one. I don't think it's a showstopper for accepting the feature either, we just have to document that great care is required with any operator or function that could raise an error in a row filter. But there are just so many often non-obvious ways you can land up with an ERROR being thrown that I think it's a bit of a user foot-gun. -- Craig Ringer http://www.2ndQuadrant.com/ 2ndQuadrant - PostgreSQL Solutions for the Enterprise