Improve assertion in FindReplTupleInLocalRel().
authorAmit Kapila <[email protected]>
Wed, 11 Sep 2024 03:48:23 +0000 (09:18 +0530)
committerAmit Kapila <[email protected]>
Wed, 11 Sep 2024 03:48:23 +0000 (09:18 +0530)
The first part of the assertion verifying that the passed index must be PK
or RI was incorrectly passing index relation instead of heap relation in
GetRelationIdentityOrPK(). The assertion was not failing because the
second part of the assertion which needs to be performed only when remote
relation has REPLICA_IDENTITY_FULL set was also incorrect.

The change is not backed because the current coding doesn't lead to
any failure.

Reported-by: Dilip Kumar
Author: Amit Kapila
Reviewed-by: Vignesh C
Discussion: https://postgr.es/m/CAFiTN-tmguaT1DXbCC+ZomZg-oZLmU6BPhr0po7akQSG6vNJrg@mail.gmail.com

src/backend/replication/logical/worker.c

index 0fb577d3281fbbfab182af372b90e5de2aa102c2..925dff9cc44804465db87e93c29a04e1f0e21b27 100644 (file)
@@ -2929,9 +2929,10 @@ FindReplTupleInLocalRel(ApplyExecutionData *edata, Relation localrel,
        Relation    idxrel = index_open(localidxoid, AccessShareLock);
 
        /* Index must be PK, RI, or usable for REPLICA IDENTITY FULL tables */
-       Assert(GetRelationIdentityOrPK(idxrel) == localidxoid ||
-              IsIndexUsableForReplicaIdentityFull(BuildIndexInfo(idxrel),
-                                                  edata->targetRel->attrmap));
+       Assert(GetRelationIdentityOrPK(localrel) == localidxoid ||
+              (remoterel->replident == REPLICA_IDENTITY_FULL &&
+               IsIndexUsableForReplicaIdentityFull(BuildIndexInfo(idxrel),
+                                                   edata->targetRel->attrmap)));
        index_close(idxrel, AccessShareLock);
 #endif