@ -393,21 +393,28 @@ AlterPublicationTables(AlterPublicationStmt *stmt, Relation rel,
foreach ( newlc , rels )
{
Relation newrel = ( Relation ) lfirst ( newlc ) ;
PublicationRelInfo * newpubrel ;
if ( RelationGetRelid ( newrel ) = = oldrelid )
newpubrel = ( PublicationRelInfo * ) lfirst ( newlc ) ;
if ( RelationGetRelid ( newpubrel - > relation ) = = oldrelid )
{
found = true ;
break ;
}
}
/* Not yet in the list, open it and add to the list */
if ( ! found )
{
Relation oldrel = table_open ( oldrelid ,
ShareUpdateExclusiveLock ) ;
Relation oldrel ;
PublicationRelInfo * pubrel ;
/* Wrap relation into PublicationRelInfo */
oldrel = table_open ( oldrelid , ShareUpdateExclusiveLock ) ;
pubrel = palloc ( sizeof ( PublicationRelInfo ) ) ;
pubrel - > relation = oldrel ;
delrels = lappend ( delrels , oldrel ) ;
delrels = lappend ( delrels , pub rel) ;
}
}
@ -498,9 +505,9 @@ RemovePublicationRelById(Oid proid)
}
/*
* Open relations specified by a RangeVar list .
* The returned tables are locked in ShareUpdateExclusiveLock mode in order to
* add them to a publication .
* Open relations specified by a PublicationTable list .
* In the returned list of PublicationRelInfo , tables are locked
* in ShareUpdateExclusiveLock mode in order to add them to a publication .
*/
static List *
OpenTableList ( List * tables )
@ -514,15 +521,16 @@ OpenTableList(List *tables)
*/
foreach ( lc , tables )
{
RangeVar * rv = lfirst_node ( RangeVar , lc ) ;
bool recurse = rv - > inh ;
PublicationTable * t = lfirst_node ( PublicationTable , lc ) ;
bool recurse = t - > relation - > inh ;
Relation rel ;
Oid myrelid ;
PublicationRelInfo * pub_rel ;
/* Allow query cancel in case this takes a long time */
CHECK_FOR_INTERRUPTS ( ) ;
rel = table_openrv ( rv , ShareUpdateExclusiveLock ) ;
rel = table_openrv ( t - > relation , ShareUpdateExclusiveLock ) ;
myrelid = RelationGetRelid ( rel ) ;
/*
@ -538,7 +546,9 @@ OpenTableList(List *tables)
continue ;
}
rels = lappend ( rels , rel ) ;
pub_rel = palloc ( sizeof ( PublicationRelInfo ) ) ;
pub_rel - > relation = rel ;
rels = lappend ( rels , pub_rel ) ;
relids = lappend_oid ( relids , myrelid ) ;
/*
@ -571,7 +581,9 @@ OpenTableList(List *tables)
/* find_all_inheritors already got lock */
rel = table_open ( childrelid , NoLock ) ;
rels = lappend ( rels , rel ) ;
pub_rel = palloc ( sizeof ( PublicationRelInfo ) ) ;
pub_rel - > relation = rel ;
rels = lappend ( rels , pub_rel ) ;
relids = lappend_oid ( relids , childrelid ) ;
}
}
@ -592,9 +604,10 @@ CloseTableList(List *rels)
foreach ( lc , rels )
{
Relation rel = ( Relation ) lfirst ( lc ) ;
PublicationRelInfo * pub_rel ;
table_close ( rel , NoLock ) ;
pub_rel = ( PublicationRelInfo * ) lfirst ( lc ) ;
table_close ( pub_rel - > relation , NoLock ) ;
}
}
@ -611,7 +624,8 @@ PublicationAddTables(Oid pubid, List *rels, bool if_not_exists,
foreach ( lc , rels )
{
Relation rel = ( Relation ) lfirst ( lc ) ;
PublicationRelInfo * pub_rel = ( PublicationRelInfo * ) lfirst ( lc ) ;
Relation rel = pub_rel - > relation ;
ObjectAddress obj ;
/* Must be owner of the table or superuser. */
@ -619,7 +633,7 @@ PublicationAddTables(Oid pubid, List *rels, bool if_not_exists,
aclcheck_error ( ACLCHECK_NOT_OWNER , get_relkind_objtype ( rel - > rd_rel - > relkind ) ,
RelationGetRelationName ( rel ) ) ;
obj = publication_add_relation ( pubid , rel , if_not_exists ) ;
obj = publication_add_relation ( pubid , pub_ rel, if_not_exists ) ;
if ( stmt )
{
EventTriggerCollectSimpleCommand ( obj , InvalidObjectAddress ,
@ -643,7 +657,8 @@ PublicationDropTables(Oid pubid, List *rels, bool missing_ok)
foreach ( lc , rels )
{
Relation rel = ( Relation ) lfirst ( lc ) ;
PublicationRelInfo * pubrel = ( PublicationRelInfo * ) lfirst ( lc ) ;
Relation rel = pubrel - > relation ;
Oid relid = RelationGetRelid ( rel ) ;
prid = GetSysCacheOid2 ( PUBLICATIONRELMAP , Anum_pg_publication_rel_oid ,