On Wed, Sep 29, 2021 at 5:48 PM houzj.f...@fujitsu.com
<houzj.f...@fujitsu.com> wrote:
>
> On Wed, Sep 29, 2021 5:14 PM Amit Kapila <amit.kapil...@gmail.com> wrote:
> > On Wed, Sep 29, 2021 at 11:59 AM houzj.f...@fujitsu.com
> > <houzj.f...@fujitsu.com> wrote:
> > >
> > > On Wed, Sep 29, 2021 12:34 PM Amit Kapila <amit.kapil...@gmail.com>
> > > > On Wed, Sep 29, 2021 at 9:07 AM houzj.f...@fujitsu.com
> > > > <houzj.f...@fujitsu.com> wrote:
> > > > >
> > > > > On Tues, Sep 28, 2021 10:46 PM vignesh C <vignes...@gmail.com>
> > wrote:
> > > > > > Attached v34 patch has the changes for the same.
> > > > > How about we check this case like the following ?
> > > > >
> > > > > List       *schemaPubids = GetSchemaPublications(nspOid);
> > > > > List       *relPubids = 
> > > > > GetRelationPublications(RelationGetRelid(rel));
> > > > > if (list_intersection(schemaPubids, relPubids))
> > > > >         ereport(ERROR, ...
> > > > >
> > > >
> > > > Won't this will allow changing one of the partitions for which only
> > > > partitioned table is part of the target schema?
> > >
> > > I think it still disallow changing partition's schema to the published 
> > > one.
> > > I tested with the following SQLs.
> > > -----
> > > create schema sch1;
> > > create schema sch2;
> > > create schema sch3;
> > >
> > > create table sch1.tbl1 (a int) partition by range ( a ); create table
> > > sch2.tbl1_part1 partition of sch1.tbl1 for values from (1) to (101);
> > > create table sch3.tbl1_part2 partition of sch1.tbl1 for values from
> > > (101) to (200); create publication pub for ALL TABLES IN schema sch1,
> > > TABLE sch2.tbl1_part1; alter table sch2.tbl1_part1 set schema sch1;
> > > ---* It will report an error here *
> > > -----
> > >
> >
> > Use all steps before "create publication" and then try below. These will 
> > give an
> > error with the patch proposed but if I change it to what you are proposing 
> > then
> > it won't give an error.
> > create publication pub for ALL TABLES IN schema sch2, Table sch1.tbl1; alter
> > table sch3.tbl1_part2 set schema sch2;
> >
> > But now again thinking about it, I am not sure if we really want to give 
> > error in
> > this case. What do you think?
>
> Personally, I think we can allow the above case.
>
> Because if user specify the partitioned table in the publication like above,
> they cannot drop the partition separately. And the partitioned table is the
> actual one in pg_publication_rel. So, I think allowing this case seems won't
> make people feel confused.
>

Yeah, I also thought on similar lines. So, let's allow this case.

>
> > Also, if we use list_intersection trick, then how will
> > we tell the publication due to which this problem has occurred, or do you 
> > think
> > we should leave that as an exercise for the user?
>
> I thought list_intersection will return a puboids list in which the puboid 
> exists in both input list.
> We can choose the first puboid and output it in the error message which seems 
> the same as
> the current patch.
>
> But I noticed list_intersection doesn't support T_OidList, so we might need 
> to search the puboid
> Manually. Like:
>
>         foreach(cell, relPubids)
>         {
>                 if (list_member_oid(schemaPubids, lfirst_oid(cell)))
>                                 ereport(ERROR,
>                                                 
> errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
>                                                 errmsg("cannot move table 
> \"%s\" to schema \"%s\"",
>                                                            
> RelationGetRelationName(rel), stmt->newschema),
>                                                 errdetail("Altering table 
> will result in having schema \"%s\" and same schema's table \"%s\" in the 
> publication \"%s\" which is not supported.",
>                                                                   
> stmt->newschema,
>                                                                   
> RelationGetRelationName(rel),
>                                                                   
> get_publication_name(lfirst_oid(cell), false)));
>         }
>

Looks good to me.


-- 
With Regards,
Amit Kapila.


Reply via email to