On Mon, Nov 15, 2021 at 2:44 PM Dilip Kumar <dilipbal...@gmail.com> wrote: > > On Fri, Nov 12, 2021 at 3:49 PM Ajin Cherian <itsa...@gmail.com> wrote: > > > > Attaching version 39-
I have reviewed, 0001* and I have a few comments on it --- >If you choose to do the initial table synchronization, only data that satisfies >the row filters is sent. I think this comment is not correct, I think the correct statement would be "only data that satisfies the row filters is pulled by the subscriber" --- --- + The <literal>WHERE</literal> clause should contain only columns that are + part of the primary key or be covered by <literal>REPLICA + IDENTITY</literal> otherwise, <command>DELETE</command> operations will not + be replicated. That's because old row is used and it only contains primary + key or columns that are part of the <literal>REPLICA IDENTITY</literal>; the + remaining columns are <literal>NULL</literal>. For <command>INSERT</command> + and <command>UPDATE</command> operations, any column might be used in the + <literal>WHERE</literal> clause. I think this message is not correct, because for update also we can not have filters on the non-key attribute right? Even w.r.t the first patch also if the non update non key toast columns are there we can not apply filters on those. So this comment seems misleading to me. --- - Oid relid = RelationGetRelid(targetrel->relation); .. + relid = RelationGetRelid(targetrel); + Why this change is required, I mean instead of fetching the relid during the variable declaration why do we need to do it separately now? --- + if (expr == NULL) + ereport(ERROR, + (errcode(ERRCODE_CANNOT_COERCE), + errmsg("row filter returns type %s that cannot be coerced to the expected type %s", Instead of "coerced to" can we use "cast to"? That will be in sync with other simmilar kind od user exposed error message. ---- +static ExprState * +pgoutput_row_filter_init_expr(Node *rfnode) +{ ..... + /* + * Cache ExprState using CacheMemoryContext. This is the same code as + * ExecPrepareExpr() but that is not used because it doesn't use an EState. + * It should probably be another function in the executor to handle the + * execution outside a normal Plan tree context. + */ + oldctx = MemoryContextSwitchTo(CacheMemoryContext); + expr = expression_planner(expr); + exprstate = ExecInitExpr(expr, NULL); + MemoryContextSwitchTo(oldctx); + + return exprstate; +} I can see the caller of this function is already switching to CacheMemoryContext, so what is the point in doing it again here? Maybe if called is expected to do show we can Asssert on the CurrentMemoryContext. -- Regards, Dilip Kumar EnterpriseDB: http://www.enterprisedb.com