@@ -273,10 +273,15 @@ static const dshash_parameters srtr_typmod_table_params = {
273273/* hashtable for recognizing registered record types */
274274static HTAB * RecordCacheHash = NULL ;
275275
276- /* arrays of info about registered record types, indexed by assigned typmod */
277- static TupleDesc * RecordCacheArray = NULL ;
278- static uint64 * RecordIdentifierArray = NULL ;
279- static int32 RecordCacheArrayLen = 0 ; /* allocated length of above arrays */
276+ typedef struct RecordCacheArrayEntry
277+ {
278+ uint64 id ;
279+ TupleDesc tupdesc ;
280+ } RecordCacheArrayEntry ;
281+
282+ /* array of info about registered record types, indexed by assigned typmod */
283+ static RecordCacheArrayEntry * RecordCacheArray = NULL ;
284+ static int32 RecordCacheArrayLen = 0 ; /* allocated length of above array */
280285static int32 NextRecordTypmod = 0 ; /* number of entries used */
281286
282287/*
@@ -1703,19 +1708,20 @@ ensure_record_cache_typmod_slot_exists(int32 typmod)
17031708{
17041709 if (RecordCacheArray == NULL )
17051710 {
1706- RecordCacheArray = (TupleDesc * )
1707- MemoryContextAllocZero (CacheMemoryContext , 64 * sizeof (TupleDesc ));
1708- RecordIdentifierArray = (uint64 * )
1709- MemoryContextAllocZero (CacheMemoryContext , 64 * sizeof (uint64 ));
1711+ RecordCacheArray = (RecordCacheArrayEntry * )
1712+ MemoryContextAllocZero (CacheMemoryContext ,
1713+ 64 * sizeof (RecordCacheArrayEntry ));
17101714 RecordCacheArrayLen = 64 ;
17111715 }
17121716
17131717 if (typmod >= RecordCacheArrayLen )
17141718 {
17151719 int32 newlen = pg_nextpower2_32 (typmod + 1 );
17161720
1717- RecordCacheArray = repalloc0_array (RecordCacheArray , TupleDesc , RecordCacheArrayLen , newlen );
1718- RecordIdentifierArray = repalloc0_array (RecordIdentifierArray , uint64 , RecordCacheArrayLen , newlen );
1721+ RecordCacheArray = repalloc0_array (RecordCacheArray ,
1722+ RecordCacheArrayEntry ,
1723+ RecordCacheArrayLen ,
1724+ newlen );
17191725 RecordCacheArrayLen = newlen ;
17201726 }
17211727}
@@ -1753,8 +1759,8 @@ lookup_rowtype_tupdesc_internal(Oid type_id, int32 typmod, bool noError)
17531759 {
17541760 /* It is already in our local cache? */
17551761 if (typmod < RecordCacheArrayLen &&
1756- RecordCacheArray [typmod ] != NULL )
1757- return RecordCacheArray [typmod ];
1762+ RecordCacheArray [typmod ]. tupdesc != NULL )
1763+ return RecordCacheArray [typmod ]. tupdesc ;
17581764
17591765 /* Are we attached to a shared record typmod registry? */
17601766 if (CurrentSession -> shared_typmod_registry != NULL )
@@ -1780,19 +1786,19 @@ lookup_rowtype_tupdesc_internal(Oid type_id, int32 typmod, bool noError)
17801786 * Our local array can now point directly to the TupleDesc
17811787 * in shared memory, which is non-reference-counted.
17821788 */
1783- RecordCacheArray [typmod ] = tupdesc ;
1789+ RecordCacheArray [typmod ]. tupdesc = tupdesc ;
17841790 Assert (tupdesc -> tdrefcount == -1 );
17851791
17861792 /*
17871793 * We don't share tupdesc identifiers across processes, so
17881794 * assign one locally.
17891795 */
1790- RecordIdentifierArray [typmod ] = ++ tupledesc_id_counter ;
1796+ RecordCacheArray [typmod ]. id = ++ tupledesc_id_counter ;
17911797
17921798 dshash_release_lock (CurrentSession -> shared_typmod_table ,
17931799 entry );
17941800
1795- return RecordCacheArray [typmod ];
1801+ return RecordCacheArray [typmod ]. tupdesc ;
17961802 }
17971803 }
17981804 }
@@ -2005,10 +2011,10 @@ assign_record_type_typmod(TupleDesc tupDesc)
20052011 ensure_record_cache_typmod_slot_exists (entDesc -> tdtypmod );
20062012 }
20072013
2008- RecordCacheArray [entDesc -> tdtypmod ] = entDesc ;
2014+ RecordCacheArray [entDesc -> tdtypmod ]. tupdesc = entDesc ;
20092015
20102016 /* Assign a unique tupdesc identifier, too. */
2011- RecordIdentifierArray [entDesc -> tdtypmod ] = ++ tupledesc_id_counter ;
2017+ RecordCacheArray [entDesc -> tdtypmod ]. id = ++ tupledesc_id_counter ;
20122018
20132019 /* Fully initialized; create the hash table entry */
20142020 recentry = (RecordCacheEntry * ) hash_search (RecordCacheHash ,
@@ -2057,10 +2063,10 @@ assign_record_type_identifier(Oid type_id, int32 typmod)
20572063 * It's a transient record type, so look in our record-type table.
20582064 */
20592065 if (typmod >= 0 && typmod < RecordCacheArrayLen &&
2060- RecordCacheArray [typmod ] != NULL )
2066+ RecordCacheArray [typmod ]. tupdesc != NULL )
20612067 {
2062- Assert (RecordIdentifierArray [typmod ] != 0 );
2063- return RecordIdentifierArray [typmod ];
2068+ Assert (RecordCacheArray [typmod ]. id != 0 );
2069+ return RecordCacheArray [typmod ]. id ;
20642070 }
20652071
20662072 /* For anonymous or unrecognized record type, generate a new ID */
@@ -2140,7 +2146,7 @@ SharedRecordTypmodRegistryInit(SharedRecordTypmodRegistry *registry,
21402146 TupleDesc tupdesc ;
21412147 bool found ;
21422148
2143- tupdesc = RecordCacheArray [typmod ];
2149+ tupdesc = RecordCacheArray [typmod ]. tupdesc ;
21442150 if (tupdesc == NULL )
21452151 continue ;
21462152
0 commit comments