mirror of
https://github.com/postgres/postgres.git
synced 2025-07-15 19:21:59 +03:00
Fix table syncing with different column order
Logical replication supports replicating between tables with different column order. But this failed for the initial table sync because of a logic error in how the column list for the internal COPY command was composed. Fix that and also add a test. Also fix a minor omission in the column name mapping cache. When creating the mapping list, it would not skip locally dropped columns. So if a remote column had the same name as a locally dropped column (...pg.dropped...), then the expected error would not occur.
This commit is contained in:
@ -492,25 +492,15 @@ static List *
|
||||
make_copy_attnamelist(LogicalRepRelMapEntry *rel)
|
||||
{
|
||||
List *attnamelist = NIL;
|
||||
TupleDesc desc = RelationGetDescr(rel->localrel);
|
||||
int i;
|
||||
|
||||
for (i = 0; i < desc->natts; i++)
|
||||
for (i = 0; i < rel->remoterel.natts; i++)
|
||||
{
|
||||
int remoteattnum = rel->attrmap[i];
|
||||
|
||||
/* Skip dropped attributes. */
|
||||
if (desc->attrs[i]->attisdropped)
|
||||
continue;
|
||||
|
||||
/* Skip attributes that are missing on remote side. */
|
||||
if (remoteattnum < 0)
|
||||
continue;
|
||||
|
||||
attnamelist = lappend(attnamelist,
|
||||
makeString(rel->remoterel.attnames[remoteattnum]));
|
||||
makeString(rel->remoterel.attnames[i]));
|
||||
}
|
||||
|
||||
|
||||
return attnamelist;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user