Allow table AM's to use rd_amcache, too.

The rd_amcache allows an index AM to cache arbitrary information in a
relcache entry. This commit moves the cleanup of rd_amcache so that it
can also be used by table AMs. Nothing takes advantage of that yet, but
I'm sure it'll come handy for anyone writing new table AMs.

Backpatch to v12, where table AM interface was introduced.

Reviewed-by: Julien Rouhaud
This commit is contained in:
Heikki Linnakangas 2019-07-30 21:43:27 +03:00
parent d8b094dabb
commit a29834beb1
2 changed files with 20 additions and 10 deletions

View File

@ -2357,6 +2357,10 @@ RelationDestroyRelation(Relation relation, bool remember_tupdesc)
pfree(relation->rd_options); pfree(relation->rd_options);
if (relation->rd_indextuple) if (relation->rd_indextuple)
pfree(relation->rd_indextuple); pfree(relation->rd_indextuple);
if (relation->rd_amcache)
pfree(relation->rd_amcache);
if (relation->rd_fdwroutine)
pfree(relation->rd_fdwroutine);
if (relation->rd_indexcxt) if (relation->rd_indexcxt)
MemoryContextDelete(relation->rd_indexcxt); MemoryContextDelete(relation->rd_indexcxt);
if (relation->rd_rulescxt) if (relation->rd_rulescxt)
@ -2369,8 +2373,6 @@ RelationDestroyRelation(Relation relation, bool remember_tupdesc)
MemoryContextDelete(relation->rd_pdcxt); MemoryContextDelete(relation->rd_pdcxt);
if (relation->rd_partcheckcxt) if (relation->rd_partcheckcxt)
MemoryContextDelete(relation->rd_partcheckcxt); MemoryContextDelete(relation->rd_partcheckcxt);
if (relation->rd_fdwroutine)
pfree(relation->rd_fdwroutine);
pfree(relation); pfree(relation);
} }
@ -2415,6 +2417,11 @@ RelationClearRelation(Relation relation, bool rebuild)
*/ */
RelationCloseSmgr(relation); RelationCloseSmgr(relation);
/* Free AM cached data, if any */
if (relation->rd_amcache)
pfree(relation->rd_amcache);
relation->rd_amcache = NULL;
/* /*
* Treat nailed-in system relations separately, they always need to be * Treat nailed-in system relations separately, they always need to be
* accessible, so we can't blow them away. * accessible, so we can't blow them away.

View File

@ -152,13 +152,6 @@ typedef struct RelationData
* those with lefttype and righttype equal to the opclass's opcintype. The * those with lefttype and righttype equal to the opclass's opcintype. The
* arrays are indexed by support function number, which is a sufficient * arrays are indexed by support function number, which is a sufficient
* identifier given that restriction. * identifier given that restriction.
*
* Note: rd_amcache is available for index AMs to cache private data about
* an index. This must be just a cache since it may get reset at any time
* (in particular, it will get reset by a relcache inval message for the
* index). If used, it must point to a single memory chunk palloc'd in
* rd_indexcxt. A relcache reset will include freeing that chunk and
* setting rd_amcache = NULL.
*/ */
MemoryContext rd_indexcxt; /* private memory cxt for this stuff */ MemoryContext rd_indexcxt; /* private memory cxt for this stuff */
/* use "struct" here to avoid needing to include amapi.h: */ /* use "struct" here to avoid needing to include amapi.h: */
@ -173,9 +166,19 @@ typedef struct RelationData
Oid *rd_exclops; /* OIDs of exclusion operators, if any */ Oid *rd_exclops; /* OIDs of exclusion operators, if any */
Oid *rd_exclprocs; /* OIDs of exclusion ops' procs, if any */ Oid *rd_exclprocs; /* OIDs of exclusion ops' procs, if any */
uint16 *rd_exclstrats; /* exclusion ops' strategy numbers, if any */ uint16 *rd_exclstrats; /* exclusion ops' strategy numbers, if any */
void *rd_amcache; /* available for use by index AM */
Oid *rd_indcollation; /* OIDs of index collations */ Oid *rd_indcollation; /* OIDs of index collations */
/*
* rd_amcache is available for index and table AMs to cache private data
* about the relation. This must be just a cache since it may get reset
* at any time (in particular, it will get reset by a relcache inval
* message for the relation). If used, it must point to a single memory
* chunk palloc'd in CacheMemoryContext, or in rd_indexcxt for an index
* relation. A relcache reset will include freeing that chunk and setting
* rd_amcache = NULL.
*/
void *rd_amcache; /* available for use by index/table AM */
/* /*
* foreign-table support * foreign-table support
* *