RE: Added schema level support for publication. - Mailing list pgsql-hackers

From houzj.fnst@fujitsu.com
Subject RE: Added schema level support for publication.
Date
Msg-id OS0PR01MB571621294209A6832A691B5094199@OS0PR01MB5716.jpnprd01.prod.outlook.com
Whole thread Raw
In response to Re: Added schema level support for publication.  (vignesh C <vignesh21@gmail.com>)
Responses RE: Added schema level support for publication.  ("houzj.fnst@fujitsu.com" <houzj.fnst@fujitsu.com>)
Re: Added schema level support for publication.  (vignesh C <vignesh21@gmail.com>)
List pgsql-hackers
On Wednesday, June 30, 2021 7:43 PM vignesh C <vignesh21@gmail.com> wrote:
> Thanks for reporting this issue, the attached v9 patch fixes this issue. This also fixes the other issue you reported
at[1].
 

Hi,

I had a look at the patch, please consider following comments.

(1)
-            if (pub->alltables)
+            if (pub->pubtype == PUBTYPE_ALLTABLES)
             {
                 publish = true;
                 if (pub->pubviaroot && am_partition)
                     publish_as_relid = llast_oid(get_partition_ancestors(relid));
             }
 
+            if (pub->pubtype == PUBTYPE_SCHEMA)
+            {
+                Oid            schemaId = get_rel_namespace(relid);
+                List       *pubschemas = GetPublicationSchemas(pub->oid);
+
+                if (list_member_oid(pubschemas, schemaId))
+                {

It might be better use "else if" for the second check here.
Like: else if (pub->pubtype == PUBTYPE_SCHEMA)

Besides, we already have the {schemaoid, pubid} set here, it might be
better to scan the cache PUBLICATIONSCHEMAMAP instead of invoking
GetPublicationSchemas() which will scan the whole table.


(2)
+        /* Identify which schemas should be dropped. */
+        foreach(oldlc, oldschemaids)
+        {
+            Oid            oldschemaid = lfirst_oid(oldlc);
+            ListCell   *newlc;
+            bool        found = false;
+
+            foreach(newlc, schemaoidlist)
+            {
+                Oid            newschemaid = lfirst_oid(newlc);
+
+                if (newschemaid == oldschemaid)
+                {
+                    found = true;
+                    break;
+                }
+            }

It seems we can use " if (list_member_oid(schemaoidlist, oldschemaid)) "
to replace the second foreach loop.

(3)
there are some testcases change in 0001 patch, it might be better move them
to 0002 patch.


(4)
+        case OBJECT_PUBLICATION_SCHEMA:
+            objnode = (Node *) list_make2(linitial(name), linitial(args));
+            break;
         case OBJECT_USER_MAPPING:
             objnode = (Node *) list_make2(linitial(name), linitial(args));
             break;

Does it looks better to merge these two switch cases ?
Like:
case OBJECT_PUBLICATION_SCHEMA:
case OBJECT_USER_MAPPING:
    objnode = (Node *) list_make2(linitial(name), linitial(args));
    break;

best regards,
houzj

pgsql-hackers by date:

Previous
From: Bharath Rupireddy
Date:
Subject: Re: bugfix: when the blocksize is 32k, the function page_header of pageinspect returns negative numbers.
Next
From: Alexander Lakhin
Date:
Subject: Re: More time spending with "delete pending"