RE: Column Filtering in Logical Replication - Mailing list pgsql-hackers
From | houzj.fnst@fujitsu.com |
---|---|
Subject | RE: Column Filtering in Logical Replication |
Date | |
Msg-id | OS0PR01MB571617A4C02658FE0767ABE494A59@OS0PR01MB5716.jpnprd01.prod.outlook.com Whole thread Raw |
In response to | Re: Column Filtering in Logical Replication (Alvaro Herrera <alvherre@alvh.no-ip.org>) |
List | pgsql-hackers |
From Fri, Sep 24, 2021 9:25 PM Alvaro Herrera <alvherre@alvh.no-ip.org> wrote: > On 2021-Sep-23, Amit Kapila wrote: > > > Alvaro, do you have any thoughts on these proposed grammar changes? > > Yeah, I think pubobj_name remains a problem in that you don't know its return > type -- could be a String or a RangeVar, and the user of that production can't > distinguish. So you're still (unnecessarily, IMV) stashing an object of > undetermined type into ->object. > > I think you should get rid of both pubobj_name and pubobj_expr and do > somethine like this: > PublicationObjSpec: TABLE ColId > { > $$ = makeNode(PublicationObjSpec); > $$->pubobjtype = PUBLICATIONOBJ_TABLE; > $$->rangevar = makeRangeVarFromQualifiedName($1, NULL, @1, yyscanner); > } > | TABLE ColId indirection > { > $$ = makeNode(PublicationObjSpec); > $$->pubobjtype = PUBLICATIONOBJ_TABLE; > $$->rangevar = makeRangeVarFromQualifiedName($1, $2, @1, yyscanner); > } Hi, IIRC, the above grammar doesn't support extended relation expression (like: "tablename * ", "ONLY tablename", "ONLY '( tablename )") which is part of rule relation_expr. I think we should add these too. And if we move forward with the design you proposed, we should do something like the following: /* FOR TABLE and FOR ALL TABLES IN SCHEMA specifications */ PublicationObjSpec: TABLE relation_expr { $$ = makeNode(PublicationObjSpec); $$->pubobjtype = PUBLICATIONOBJ_TABLE; $$->rangevar = $2; } | ALL TABLES IN_P SCHEMA ColId { $$ = makeNode(PublicationObjSpec); $$->pubobjtype = PUBLICATIONOBJ_REL_IN_SCHEMA; $$->name = $5; } | ALL TABLES IN_P SCHEMA CURRENT_SCHEMA { $$ = makeNode(PublicationObjSpec); $$->pubobjtype = PUBLICATIONOBJ_CURRSCHEMA; $$->name = $5; } | extended_relation_expr /* grammar like tablename * , ONLY tablename, ONLY ( tablename )*/ { $$ = makeNode(PublicationObjSpec); $$->rangevar = makeRangeVarFromQualifiedName($1, $2, @1, yyscanner); $$->pubobjtype = PUBLICATIONOBJ_CONTINUATION; } | ColId { $$ = makeNode(PublicationObjSpec); $$->name = $1; $$->pubobjtype = PUBLICATIONOBJ_CONTINUATION; } | ColId indirection { $$ = makeNode(PublicationObjSpec); $$->rangevar = makeRangeVarFromQualifiedName($1, $2, @1, yyscanner); $$->pubobjtype = PUBLICATIONOBJ_CONTINUATION; } Best regards, Hou zj
pgsql-hackers by date: