aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPeter Eisentraut <peter@eisentraut.org>2024-12-04 08:33:28 +0100
committerPeter Eisentraut <peter@eisentraut.org>2024-12-04 08:33:28 +0100
commit7727049e8f663344d4d0457e1d9ec048d626f3d9 (patch)
treeae0ec22552d7c17809ed5a6efe0b677b14d33518 /src
parent87ce27de6963091f4a365f80bcdb06b9da098f00 (diff)
downloadpostgresql-7727049e8f663344d4d0457e1d9ec048d626f3d9.tar.gz
postgresql-7727049e8f663344d4d0457e1d9ec048d626f3d9.zip
Simplify IsIndexUsableForReplicaIdentityFull()
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
Diffstat (limited to 'src')
-rw-r--r--src/backend/replication/logical/relation.c16
-rw-r--r--src/backend/replication/logical/worker.c2
-rw-r--r--src/include/replication/logicalrelation.h2
3 files changed, 9 insertions, 11 deletions
diff --git a/src/backend/replication/logical/relation.c b/src/backend/replication/logical/relation.c
index b355f32f03c..71a1b7e01eb 100644
--- a/src/backend/replication/logical/relation.c
+++ b/src/backend/replication/logical/relation.c
@@ -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
diff --git a/src/backend/replication/logical/worker.c b/src/backend/replication/logical/worker.c
index 925dff9cc44..46d3ad566f6 100644
--- a/src/backend/replication/logical/worker.c
+++ b/src/backend/replication/logical/worker.c
@@ -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
diff --git a/src/include/replication/logicalrelation.h b/src/include/replication/logicalrelation.h
index e687b40a566..33534672ec3 100644
--- a/src/include/replication/logicalrelation.h
+++ b/src/include/replication/logicalrelation.h
@@ -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 */