From Fri, Sep 24, 2021 9:25 PM Alvaro Herrera <[email protected]> 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