Hi Ajin,

Some review comments for patch v17-0002.

======
src/backend/replication/logical/decode.c

1.
 /*
+ * Check if filtering changes before decoding is supported and we're
not suppressing filter
+ * changes currently.
+ */
+static inline bool
+FilterChangeIsEnabled(LogicalDecodingContext *ctx)
+{
+ return (ctx->callbacks.filter_change_cb != NULL &&
+ ctx->reorder->try_to_filter_change);
+}
+

I still have doubts about the need for/benefits of this to be a
separate function.

It is only called from *one* place within the other static function,
FilterChange.

Just putting that code inline seems just as readable as maintaining
the separate function for it.

SUGGESTION:
static inline bool
FilterChange(LogicalDecodingContext *ctx, XLogRecPtr origptr, TransactionId xid,
             RelFileLocator *target_locator, ReorderBufferChangeType
change_type)
{
  return
    ctx->callbacks.filter_change_cb &&
    ctx->reorder->try_to_filter_change &&
    ReorderBufferFilterByRelFileLocator(ctx->reorder, xid, origptr,
target_locator,
                                        change_type));
}


======
src/backend/replication/logical/reorderbuffer.c

RelFileLocatorCacheInvalidateCallback:

2.
  if (hash_search(RelFileLocatorFilterCache,
- &entry->key,
- HASH_REMOVE,
- NULL) == NULL)
+ &entry->key,
+ HASH_REMOVE,
+ NULL) == NULL)
  elog(ERROR, "hash table corrupted");

I think this whitespace change belongs back in patch 0001 where this
function was introduced, not here in patch 0002.

~~~

ReorderBufferFilterByRelFileLocator:

3.
+ /*
+ * Quick return if we already know that the relation is not to be
+ * decoded. These are for special relations that are unlogged and for
+ * sequences and catalogs.
+ */
+ if (entry->filterable)
+ return true;

/These are for/This is for/

~~~

4.
  if (RelationIsValid(relation))
  {
- entry->relid = RelationGetRelid(relation);
+ if (IsToastRelation(relation))
+ {
+ char   *toast_name = RelationGetRelationName(relation);
+ int     n PG_USED_FOR_ASSERTS_ONLY;
+
+ n = sscanf(toast_name, "pg_toast_%u", &entry->relid);
+
+ Assert(n == 1);
+ }
+ else
+ entry->relid = RelationGetRelid(relation);
+
  entry->filterable = false;
+ rb->try_to_filter_change = rb->filter_change(rb, entry->relid, change_type,
+   true, &cache_valid);
  RelationClose(relation);
  }
  else
  {
  entry->relid = InvalidOid;
- entry->filterable = true;
+ rb->try_to_filter_change = entry->filterable = true;
  }

  rb->try_to_filter_change = entry->filterable;
~

Something seems fishy here. AFAICT, the rb->try_to_filter_change will
already be assigned in both the *if* and the *else* blocks. So, why is
it being overwritten again outside that if/else?

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


Reply via email to