@ -451,7 +451,7 @@ logicalrep_rel_close(LogicalRepRelMapEntry *rel, LOCKMODE lockmode)
static void
logicalrep_partmap_invalidate_cb ( Datum arg , Oid reloid )
{
LogicalRepRel MapEntry * entry ;
LogicalRepPart MapEntry * entry ;
/* Just to be sure. */
if ( LogicalRepPartMap = = NULL )
@ -464,11 +464,11 @@ logicalrep_partmap_invalidate_cb(Datum arg, Oid reloid)
hash_seq_init ( & status , LogicalRepPartMap ) ;
/* TODO, use inverse lookup hashtable? */
while ( ( entry = ( LogicalRepRel MapEntry * ) hash_seq_search ( & status ) ) ! = NULL )
while ( ( entry = ( LogicalRepPart MapEntry * ) hash_seq_search ( & status ) ) ! = NULL )
{
if ( entry - > localreloid = = reloid )
if ( entry - > relmapentry . localreloid = = reloid )
{
entry - > localrelvalid = false ;
entry - > relmapentry . localrelvalid = false ;
hash_seq_term ( & status ) ;
break ;
}
@ -481,8 +481,8 @@ logicalrep_partmap_invalidate_cb(Datum arg, Oid reloid)
hash_seq_init ( & status , LogicalRepPartMap ) ;
while ( ( entry = ( LogicalRepRel MapEntry * ) hash_seq_search ( & status ) ) ! = NULL )
entry - > localrelvalid = false ;
while ( ( entry = ( LogicalRepPart MapEntry * ) hash_seq_search ( & status ) ) ! = NULL )
entry - > relmapentry . localrelvalid = false ;
}
}
@ -534,7 +534,6 @@ logicalrep_partition_open(LogicalRepRelMapEntry *root,
Oid partOid = RelationGetRelid ( partrel ) ;
AttrMap * attrmap = root - > attrmap ;
bool found ;
int i ;
MemoryContext oldctx ;
if ( LogicalRepPartMap = = NULL )
@ -545,31 +544,40 @@ logicalrep_partition_open(LogicalRepRelMapEntry *root,
( void * ) & partOid ,
HASH_ENTER , & found ) ;
if ( found )
return & part_entry - > relmapentry ;
entry = & part_entry - > relmapentry ;
memset ( part_entry , 0 , sizeof ( LogicalRepPartMapEntry ) ) ;
if ( found & & entry - > localrelvalid )
return entry ;
/* Switch to longer-lived context. */
oldctx = MemoryContextSwitchTo ( LogicalRepPartMapContext ) ;
part_entry - > partoid = partOid ;
if ( ! found )
{
memset ( part_entry , 0 , sizeof ( LogicalRepPartMapEntry ) ) ;
part_entry - > partoid = partOid ;
}
/* Remote relation is copied as-is from the root entry. */
entry = & part_entry - > relmapentry ;
entry - > remoterel . remoteid = remoterel - > remoteid ;
entry - > remoterel . nspname = pstrdup ( remoterel - > nspname ) ;
entry - > remoterel . relname = pstrdup ( remoterel - > relname ) ;
entry - > remoterel . natts = remoterel - > natts ;
entry - > remoterel . attnames = palloc ( remoterel - > natts * sizeof ( char * ) ) ;
entry - > remoterel . atttyps = palloc ( remoterel - > natts * sizeof ( Oid ) ) ;
for ( i = 0 ; i < remoterel - > natts ; i + + )
if ( ! entry - > remoterel . remoteid )
{
entry - > remoterel . attnames [ i ] = pstrdup ( remoterel - > attnames [ i ] ) ;
entry - > remoterel . atttyps [ i ] = remoterel - > atttyps [ i ] ;
int i ;
/* Remote relation is copied as-is from the root entry. */
entry = & part_entry - > relmapentry ;
entry - > remoterel . remoteid = remoterel - > remoteid ;
entry - > remoterel . nspname = pstrdup ( remoterel - > nspname ) ;
entry - > remoterel . relname = pstrdup ( remoterel - > relname ) ;
entry - > remoterel . natts = remoterel - > natts ;
entry - > remoterel . attnames = palloc ( remoterel - > natts * sizeof ( char * ) ) ;
entry - > remoterel . atttyps = palloc ( remoterel - > natts * sizeof ( Oid ) ) ;
for ( i = 0 ; i < remoterel - > natts ; i + + )
{
entry - > remoterel . attnames [ i ] = pstrdup ( remoterel - > attnames [ i ] ) ;
entry - > remoterel . atttyps [ i ] = remoterel - > atttyps [ i ] ;
}
entry - > remoterel . replident = remoterel - > replident ;
entry - > remoterel . attkeys = bms_copy ( remoterel - > attkeys ) ;
}
entry - > remoterel . replident = remoterel - > replident ;
entry - > remoterel . attkeys = bms_copy ( remoterel - > attkeys ) ;
entry - > localrel = partrel ;
entry - > localreloid = partOid ;
@ -594,7 +602,11 @@ logicalrep_partition_open(LogicalRepRelMapEntry *root,
{
AttrNumber root_attno = map - > attnums [ attno ] ;
entry - > attrmap - > attnums [ attno ] = attrmap - > attnums [ root_attno - 1 ] ;
/* 0 means it's a dropped attribute. See comments atop AttrMap. */
if ( root_attno = = 0 )
entry - > attrmap - > attnums [ attno ] = - 1 ;
else
entry - > attrmap - > attnums [ attno ] = attrmap - > attnums [ root_attno - 1 ] ;
}
}
else