Commit f884dca4 authored by Tom Lane's avatar Tom Lane

Remove RelationSetIndexList().

In the wake of commit f912d7de, RelationSetIndexList isn't used any
more.  It was always a horrid wart, so getting rid of it is very nice.
We can also convert rd_indexvalid back to a plain boolean.

Discussion: https://postgr.es/m/28926.1556664156@sss.pgh.pa.us
parent f912d7de
...@@ -3058,18 +3058,6 @@ AtEOXact_cleanup(Relation relation, bool isCommit) ...@@ -3058,18 +3058,6 @@ AtEOXact_cleanup(Relation relation, bool isCommit)
* Likewise, reset the hint about the relfilenode being new. * Likewise, reset the hint about the relfilenode being new.
*/ */
relation->rd_newRelfilenodeSubid = InvalidSubTransactionId; relation->rd_newRelfilenodeSubid = InvalidSubTransactionId;
/*
* Flush any temporary index list.
*/
if (relation->rd_indexvalid == 2)
{
list_free(relation->rd_indexlist);
relation->rd_indexlist = NIL;
relation->rd_pkindex = InvalidOid;
relation->rd_replidindex = InvalidOid;
relation->rd_indexvalid = 0;
}
} }
/* /*
...@@ -3170,18 +3158,6 @@ AtEOSubXact_cleanup(Relation relation, bool isCommit, ...@@ -3170,18 +3158,6 @@ AtEOSubXact_cleanup(Relation relation, bool isCommit,
else else
relation->rd_newRelfilenodeSubid = InvalidSubTransactionId; relation->rd_newRelfilenodeSubid = InvalidSubTransactionId;
} }
/*
* Flush any temporary index list.
*/
if (relation->rd_indexvalid == 2)
{
list_free(relation->rd_indexlist);
relation->rd_indexlist = NIL;
relation->rd_pkindex = InvalidOid;
relation->rd_replidindex = InvalidOid;
relation->rd_indexvalid = 0;
}
} }
...@@ -4337,7 +4313,7 @@ RelationGetFKeyList(Relation relation) ...@@ -4337,7 +4313,7 @@ RelationGetFKeyList(Relation relation)
* The index list is created only if someone requests it. We scan pg_index * The index list is created only if someone requests it. We scan pg_index
* to find relevant indexes, and add the list to the relcache entry so that * to find relevant indexes, and add the list to the relcache entry so that
* we won't have to compute it again. Note that shared cache inval of a * we won't have to compute it again. Note that shared cache inval of a
* relcache entry will delete the old list and set rd_indexvalid to 0, * relcache entry will delete the old list and set rd_indexvalid to false,
* so that we must recompute the index list on next request. This handles * so that we must recompute the index list on next request. This handles
* creation or deletion of an index. * creation or deletion of an index.
* *
...@@ -4377,7 +4353,7 @@ RelationGetIndexList(Relation relation) ...@@ -4377,7 +4353,7 @@ RelationGetIndexList(Relation relation)
MemoryContext oldcxt; MemoryContext oldcxt;
/* Quick exit if we already computed the list. */ /* Quick exit if we already computed the list. */
if (relation->rd_indexvalid != 0) if (relation->rd_indexvalid)
return list_copy(relation->rd_indexlist); return list_copy(relation->rd_indexlist);
/* /*
...@@ -4448,7 +4424,7 @@ RelationGetIndexList(Relation relation) ...@@ -4448,7 +4424,7 @@ RelationGetIndexList(Relation relation)
relation->rd_replidindex = candidateIndex; relation->rd_replidindex = candidateIndex;
else else
relation->rd_replidindex = InvalidOid; relation->rd_replidindex = InvalidOid;
relation->rd_indexvalid = 1; relation->rd_indexvalid = true;
MemoryContextSwitchTo(oldcxt); MemoryContextSwitchTo(oldcxt);
/* Don't leak the old list, if there is one */ /* Don't leak the old list, if there is one */
...@@ -4572,52 +4548,6 @@ insert_ordered_oid(List *list, Oid datum) ...@@ -4572,52 +4548,6 @@ insert_ordered_oid(List *list, Oid datum)
return list; return list;
} }
/*
* RelationSetIndexList -- externally force the index list contents
*
* This is used to temporarily override what we think the set of valid
* indexes is (including the presence or absence of an OID index).
* The forcing will be valid only until transaction commit or abort.
*
* This should only be applied to nailed relations, because in a non-nailed
* relation the hacked index list could be lost at any time due to SI
* messages. In practice it is only used on pg_class (see REINDEX).
*
* It is up to the caller to make sure the given list is correctly ordered.
*
* We deliberately do not change rd_indexattr here: even when operating
* with a temporary partial index list, HOT-update decisions must be made
* correctly with respect to the full index set. It is up to the caller
* to ensure that a correct rd_indexattr set has been cached before first
* calling RelationSetIndexList; else a subsequent inquiry might cause a
* wrong rd_indexattr set to get computed and cached. Likewise, we do not
* touch rd_keyattr, rd_pkattr or rd_idattr.
*/
void
RelationSetIndexList(Relation relation, List *indexIds)
{
MemoryContext oldcxt;
Assert(relation->rd_isnailed);
/* Copy the list into the cache context (could fail for lack of mem) */
oldcxt = MemoryContextSwitchTo(CacheMemoryContext);
indexIds = list_copy(indexIds);
MemoryContextSwitchTo(oldcxt);
/* Okay to replace old list */
list_free(relation->rd_indexlist);
relation->rd_indexlist = indexIds;
/*
* For the moment, assume the target rel hasn't got a pk or replica index.
* We'll load them on demand in the API that wraps access to them.
*/
relation->rd_pkindex = InvalidOid;
relation->rd_replidindex = InvalidOid;
relation->rd_indexvalid = 2; /* mark list as forced */
/* Flag relation as needing eoxact cleanup (to reset the list) */
EOXactListAdd(relation);
}
/* /*
* RelationGetPrimaryKeyIndex -- get OID of the relation's primary key index * RelationGetPrimaryKeyIndex -- get OID of the relation's primary key index
* *
...@@ -4628,12 +4558,12 @@ RelationGetPrimaryKeyIndex(Relation relation) ...@@ -4628,12 +4558,12 @@ RelationGetPrimaryKeyIndex(Relation relation)
{ {
List *ilist; List *ilist;
if (relation->rd_indexvalid == 0) if (!relation->rd_indexvalid)
{ {
/* RelationGetIndexList does the heavy lifting. */ /* RelationGetIndexList does the heavy lifting. */
ilist = RelationGetIndexList(relation); ilist = RelationGetIndexList(relation);
list_free(ilist); list_free(ilist);
Assert(relation->rd_indexvalid != 0); Assert(relation->rd_indexvalid);
} }
return relation->rd_pkindex; return relation->rd_pkindex;
...@@ -4649,12 +4579,12 @@ RelationGetReplicaIndex(Relation relation) ...@@ -4649,12 +4579,12 @@ RelationGetReplicaIndex(Relation relation)
{ {
List *ilist; List *ilist;
if (relation->rd_indexvalid == 0) if (!relation->rd_indexvalid)
{ {
/* RelationGetIndexList does the heavy lifting. */ /* RelationGetIndexList does the heavy lifting. */
ilist = RelationGetIndexList(relation); ilist = RelationGetIndexList(relation);
list_free(ilist); list_free(ilist);
Assert(relation->rd_indexvalid != 0); Assert(relation->rd_indexvalid);
} }
return relation->rd_replidindex; return relation->rd_replidindex;
...@@ -5668,9 +5598,7 @@ load_relcache_init_file(bool shared) ...@@ -5668,9 +5598,7 @@ load_relcache_init_file(bool shared)
rel->rd_refcnt = 1; rel->rd_refcnt = 1;
else else
rel->rd_refcnt = 0; rel->rd_refcnt = 0;
rel->rd_indexvalid = 0; rel->rd_indexvalid = false;
rel->rd_fkeylist = NIL;
rel->rd_fkeyvalid = false;
rel->rd_indexlist = NIL; rel->rd_indexlist = NIL;
rel->rd_pkindex = InvalidOid; rel->rd_pkindex = InvalidOid;
rel->rd_replidindex = InvalidOid; rel->rd_replidindex = InvalidOid;
...@@ -5681,6 +5609,8 @@ load_relcache_init_file(bool shared) ...@@ -5681,6 +5609,8 @@ load_relcache_init_file(bool shared)
rel->rd_pubactions = NULL; rel->rd_pubactions = NULL;
rel->rd_statvalid = false; rel->rd_statvalid = false;
rel->rd_statlist = NIL; rel->rd_statlist = NIL;
rel->rd_fkeyvalid = false;
rel->rd_fkeylist = NIL;
rel->rd_createSubid = InvalidSubTransactionId; rel->rd_createSubid = InvalidSubTransactionId;
rel->rd_newRelfilenodeSubid = InvalidSubTransactionId; rel->rd_newRelfilenodeSubid = InvalidSubTransactionId;
rel->rd_amcache = NULL; rel->rd_amcache = NULL;
......
...@@ -60,8 +60,8 @@ typedef struct RelationData ...@@ -60,8 +60,8 @@ typedef struct RelationData
bool rd_islocaltemp; /* rel is a temp rel of this session */ bool rd_islocaltemp; /* rel is a temp rel of this session */
bool rd_isnailed; /* rel is nailed in cache */ bool rd_isnailed; /* rel is nailed in cache */
bool rd_isvalid; /* relcache entry is valid */ bool rd_isvalid; /* relcache entry is valid */
char rd_indexvalid; /* state of rd_indexlist: 0 = not valid, 1 = bool rd_indexvalid; /* is rd_indexlist valid? (also rd_pkindex and
* valid, 2 = temporarily forced */ * rd_replidindex) */
bool rd_statvalid; /* is rd_statlist valid? */ bool rd_statvalid; /* is rd_statlist valid? */
/* /*
......
...@@ -66,9 +66,6 @@ extern void RelationGetExclusionInfo(Relation indexRelation, ...@@ -66,9 +66,6 @@ extern void RelationGetExclusionInfo(Relation indexRelation,
Oid **procs, Oid **procs,
uint16 **strategies); uint16 **strategies);
extern void RelationSetIndexList(Relation relation,
List *indexIds);
extern void RelationInitIndexAccessInfo(Relation relation); extern void RelationInitIndexAccessInfo(Relation relation);
/* caller must include pg_publication.h */ /* caller must include pg_publication.h */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment