Re: row filtering for logical replication - Mailing list pgsql-hackers

From Peter Smith
Subject Re: row filtering for logical replication
Date
Msg-id CAHut+PsmHkc7DXphK2=GuVcoXiKBpVXYZxf1zFYo0Tn0vuJHDg@mail.gmail.com
Whole thread Raw
In response to RE: row filtering for logical replication  ("houzj.fnst@fujitsu.com" <houzj.fnst@fujitsu.com>)
Responses RE: row filtering for logical replication
List pgsql-hackers
Here are some review comments for v65-0001 (review of updates since v64-0001)

~~~

1. src/include/commands/publicationcmds.h - rename func

+extern bool contain_invalid_rfcolumn(Oid pubid, Relation relation,
+ List *ancestors,
+ AttrNumber *invalid_rfcolumn);

I thought that function should be called "contains_..." instead of
"contain_...".

~~~

2. src/backend/commands/publicationcmds.c - rename funcs

Suggested renaming (same as above #1).

"contain_invalid_rfcolumn_walker" --> "contains_invalid_rfcolumn_walker"
"contain_invalid_rfcolumn" --> "contains_invalid_rfcolumn"

Also, update it in the comment for rf_context:
+/*
+ * Information used to validate the columns in the row filter expression. See
+ * contain_invalid_rfcolumn_walker for details.
+ */

~~~

3. src/backend/commands/publicationcmds.c - bms

+ if (!rfisnull)
+ {
+ rf_context context = {0};
+ Node    *rfnode;
+ Bitmapset    *bms = NULL;
+
+ context.pubviaroot = pub->pubviaroot;
+ context.parentid = publish_as_relid;
+ context.relid = relid;
+
+ /*
+ * Remember columns that are part of the REPLICA IDENTITY. Note that
+ * REPLICA IDENTITY DEFAULT means primary key or nothing.
+ */
+ if (relation->rd_rel->relreplident == REPLICA_IDENTITY_DEFAULT)
+ bms = RelationGetIndexAttrBitmap(relation,
+ INDEX_ATTR_BITMAP_PRIMARY_KEY);
+ else if (relation->rd_rel->relreplident == REPLICA_IDENTITY_INDEX)
+ bms = RelationGetIndexAttrBitmap(relation,
+ INDEX_ATTR_BITMAP_IDENTITY_KEY);
+
+ context.bms_replident = bms;

There seems no need for a separate 'bms' variable here. Why not just
assign directly to context.bms_replident like the code used to do?

~~~

4. src/backend/utils/cache/relcache.c - typo?

  /*
- * If we know everything is replicated, there is no point to check for
- * other publications.
+ * Check, if all columns referenced in the filter expression are part
+ * of the REPLICA IDENTITY index or not.
+ *
+ * If we already found the column in row filter which is not part of
+ * REPLICA IDENTITY index, skip the validation.
  */

Shouldn't that comment say "already found a column" instead of
"already found the column"?

~~~

5. src/backend/replication/pgoutput/pgoutput.c - map member

@@ -129,7 +169,7 @@ typedef struct RelationSyncEntry
  * same as 'relid' or if unnecessary due to partition and the ancestor
  * having identical TupleDesc.
  */
- TupleConversionMap *map;
+ AttrMap *map;
 } RelationSyncEntry;

I wondered if you should also rename this member to something more
meaningful like 'attrmap' instead of just 'map'.

------
Kind Regards,
Peter Smith.
Fujitsu Australia



pgsql-hackers by date:

Previous
From: Thomas Munro
Date:
Subject: Re: A test for replay of regression tests
Next
From: Greg Nancarrow
Date:
Subject: Re: row filtering for logical replication