Simplify IsIndexUsableForReplicaIdentityFull()
authorPeter Eisentraut <peter@eisentraut.org>
Wed, 4 Dec 2024 07:33:28 +0000 (08:33 +0100)
committerPeter Eisentraut <peter@eisentraut.org>
Wed, 4 Dec 2024 07:33:28 +0000 (08:33 +0100)
Take Relation as argument instead of IndexInfo.  Building the
IndexInfo is an unnecessary intermediate step here.

A future patch wants to get some information that is in the relcache
but not in IndexInfo, so this will also help there.

Discussion: https://www.postgresql.org/message-id/333d3886-b737-45c3-93f4-594c96bb405d@eisentraut.org

src/backend/replication/logical/relation.c
src/backend/replication/logical/worker.c
src/include/replication/logicalrelation.h

index b355f32f03c3e8d2059cfa4eaa1d2a55149db09d..71a1b7e01eb00b50f9ffe2b26bfd052a1d88264b 100644 (file)
@@ -781,11 +781,9 @@ FindUsableIndexForReplicaIdentityFull(Relation localrel, AttrMap *attrmap)
        {
                bool            isUsableIdx;
                Relation        idxRel;
-               IndexInfo  *idxInfo;
 
                idxRel = index_open(idxoid, AccessShareLock);
-               idxInfo = BuildIndexInfo(idxRel);
-               isUsableIdx = IsIndexUsableForReplicaIdentityFull(idxInfo, attrmap);
+               isUsableIdx = IsIndexUsableForReplicaIdentityFull(idxRel, attrmap);
                index_close(idxRel, AccessShareLock);
 
                /* Return the first eligible index found */
@@ -832,22 +830,22 @@ FindUsableIndexForReplicaIdentityFull(Relation localrel, AttrMap *attrmap)
  * to sequential execution, which might not be a good idea in some cases.
  */
 bool
-IsIndexUsableForReplicaIdentityFull(IndexInfo *indexInfo, AttrMap *attrmap)
+IsIndexUsableForReplicaIdentityFull(Relation idxrel, AttrMap *attrmap)
 {
        AttrNumber      keycol;
 
        /* Ensure that the index access method has a valid equal strategy */
-       if (get_equal_strategy_number_for_am(indexInfo->ii_Am) == InvalidStrategy)
+       if (get_equal_strategy_number_for_am(idxrel->rd_rel->relam) == InvalidStrategy)
                return false;
 
        /* The index must not be a partial index */
-       if (indexInfo->ii_Predicate != NIL)
+       if (!heap_attisnull(idxrel->rd_indextuple, Anum_pg_index_indpred, NULL))
                return false;
 
-       Assert(indexInfo->ii_NumIndexAttrs >= 1);
+       Assert(idxrel->rd_index->indnatts >= 1);
 
        /* The leftmost index field must not be an expression */
-       keycol = indexInfo->ii_IndexAttrNumbers[0];
+       keycol = idxrel->rd_index->indkey.values[0];
        if (!AttributeNumberIsValid(keycol))
                return false;
 
@@ -865,7 +863,7 @@ IsIndexUsableForReplicaIdentityFull(IndexInfo *indexInfo, AttrMap *attrmap)
                IndexAmRoutine *amroutine;
 
                /* The given index access method must implement amgettuple. */
-               amroutine = GetIndexAmRoutineByAmId(indexInfo->ii_Am, false);
+               amroutine = GetIndexAmRoutineByAmId(idxrel->rd_rel->relam, false);
                Assert(amroutine->amgettuple != NULL);
        }
 #endif
index 925dff9cc44804465db87e93c29a04e1f0e21b27..46d3ad566f6f436b8fbee5db1202b33156a45175 100644 (file)
@@ -2931,7 +2931,7 @@ FindReplTupleInLocalRel(ApplyExecutionData *edata, Relation localrel,
                /* Index must be PK, RI, or usable for REPLICA IDENTITY FULL tables */
                Assert(GetRelationIdentityOrPK(localrel) == localidxoid ||
                           (remoterel->replident == REPLICA_IDENTITY_FULL &&
-                               IsIndexUsableForReplicaIdentityFull(BuildIndexInfo(idxrel),
+                               IsIndexUsableForReplicaIdentityFull(idxrel,
                                                                                                        edata->targetRel->attrmap)));
                index_close(idxrel, AccessShareLock);
 #endif
index e687b40a566f1c4b21fd5495c406f4a9b92fd442..33534672ec3aba4c523a99091ced6699100d6634 100644 (file)
@@ -48,7 +48,7 @@ extern LogicalRepRelMapEntry *logicalrep_partition_open(LogicalRepRelMapEntry *r
                                                                                                                Relation partrel, AttrMap *map);
 extern void logicalrep_rel_close(LogicalRepRelMapEntry *rel,
                                                                 LOCKMODE lockmode);
-extern bool IsIndexUsableForReplicaIdentityFull(IndexInfo *indexInfo, AttrMap *attrmap);
+extern bool IsIndexUsableForReplicaIdentityFull(Relation idxrel, AttrMap *attrmap);
 extern Oid     GetRelationIdentityOrPK(Relation rel);
 
 #endif                                                 /* LOGICALRELATION_H */