@@ -263,10 +263,15 @@ static const dshash_parameters srtr_typmod_table_params = {
263263/* hashtable for recognizing registered record types */
264264static HTAB * RecordCacheHash = NULL ;
265265
266- /* arrays of info about registered record types, indexed by assigned typmod */
267- static TupleDesc * RecordCacheArray = NULL ;
268- static uint64 * RecordIdentifierArray = NULL ;
269- static int32 RecordCacheArrayLen = 0 ;/* allocated length of above arrays */
266+ typedef struct RecordCacheArrayEntry
267+ {
268+ uint64 id ;
269+ TupleDesc tupdesc ;
270+ }RecordCacheArrayEntry ;
271+
272+ /* array of info about registered record types, indexed by assigned typmod */
273+ static RecordCacheArrayEntry * RecordCacheArray = NULL ;
274+ static int32 RecordCacheArrayLen = 0 ;/* allocated length of above array */
270275static int32 NextRecordTypmod = 0 ;/* number of entries used */
271276
272277/*
@@ -1525,10 +1530,8 @@ ensure_record_cache_typmod_slot_exists(int32 typmod)
15251530{
15261531if (RecordCacheArray == NULL )
15271532{
1528- RecordCacheArray = (TupleDesc * )
1529- MemoryContextAllocZero (CacheMemoryContext ,64 * sizeof (TupleDesc ));
1530- RecordIdentifierArray = (uint64 * )
1531- MemoryContextAllocZero (CacheMemoryContext ,64 * sizeof (uint64 ));
1533+ RecordCacheArray = (RecordCacheArrayEntry * )
1534+ MemoryContextAllocZero (CacheMemoryContext ,64 * sizeof (RecordCacheArrayEntry ));
15321535RecordCacheArrayLen = 64 ;
15331536}
15341537
@@ -1539,14 +1542,11 @@ ensure_record_cache_typmod_slot_exists(int32 typmod)
15391542while (typmod >=newlen )
15401543newlen *=2 ;
15411544
1542- RecordCacheArray = (TupleDesc * )repalloc (RecordCacheArray ,
1543- newlen * sizeof (TupleDesc ));
1545+ RecordCacheArray = (RecordCacheArrayEntry * )
1546+ repalloc (RecordCacheArray ,
1547+ newlen * sizeof (RecordCacheArrayEntry ));
15441548memset (RecordCacheArray + RecordCacheArrayLen ,0 ,
1545- (newlen - RecordCacheArrayLen )* sizeof (TupleDesc ));
1546- RecordIdentifierArray = (uint64 * )repalloc (RecordIdentifierArray ,
1547- newlen * sizeof (uint64 ));
1548- memset (RecordIdentifierArray + RecordCacheArrayLen ,0 ,
1549- (newlen - RecordCacheArrayLen )* sizeof (uint64 ));
1549+ (newlen - RecordCacheArrayLen )* sizeof (RecordCacheArrayEntry ));
15501550RecordCacheArrayLen = newlen ;
15511551}
15521552}
@@ -1584,8 +1584,8 @@ lookup_rowtype_tupdesc_internal(Oid type_id, int32 typmod, bool noError)
15841584{
15851585/* It is already in our local cache? */
15861586if (typmod < RecordCacheArrayLen &&
1587- RecordCacheArray [typmod ]!= NULL )
1588- return RecordCacheArray [typmod ];
1587+ RecordCacheArray [typmod ]. tupdesc != NULL )
1588+ return RecordCacheArray [typmod ]. tupdesc ;
15891589
15901590/* Are we attached to a shared record typmod registry? */
15911591if (CurrentSession -> shared_typmod_registry != NULL )
@@ -1611,19 +1611,19 @@ lookup_rowtype_tupdesc_internal(Oid type_id, int32 typmod, bool noError)
16111611 * Our local array can now point directly to the TupleDesc
16121612 * in shared memory, which is non-reference-counted.
16131613 */
1614- RecordCacheArray [typmod ]= tupdesc ;
1614+ RecordCacheArray [typmod ]. tupdesc = tupdesc ;
16151615Assert (tupdesc -> tdrefcount == -1 );
16161616
16171617/*
16181618 * We don't share tupdesc identifiers across processes, so
16191619 * assign one locally.
16201620 */
1621- RecordIdentifierArray [typmod ]= ++ tupledesc_id_counter ;
1621+ RecordCacheArray [typmod ]. id = ++ tupledesc_id_counter ;
16221622
16231623dshash_release_lock (CurrentSession -> shared_typmod_table ,
16241624entry );
16251625
1626- return RecordCacheArray [typmod ];
1626+ return RecordCacheArray [typmod ]. tupdesc ;
16271627}
16281628}
16291629}
@@ -1834,10 +1834,10 @@ assign_record_type_typmod(TupleDesc tupDesc)
18341834ensure_record_cache_typmod_slot_exists (entDesc -> tdtypmod );
18351835}
18361836
1837- RecordCacheArray [entDesc -> tdtypmod ]= entDesc ;
1837+ RecordCacheArray [entDesc -> tdtypmod ]. tupdesc = entDesc ;
18381838
18391839/* Assign a unique tupdesc identifier, too. */
1840- RecordIdentifierArray [entDesc -> tdtypmod ]= ++ tupledesc_id_counter ;
1840+ RecordCacheArray [entDesc -> tdtypmod ]. id = ++ tupledesc_id_counter ;
18411841
18421842/* Fully initialized; create the hash table entry */
18431843recentry = (RecordCacheEntry * )hash_search (RecordCacheHash ,
@@ -1886,10 +1886,10 @@ assign_record_type_identifier(Oid type_id, int32 typmod)
18861886 * It's a transient record type, so look in our record-type table.
18871887 */
18881888if (typmod >=0 && typmod < RecordCacheArrayLen &&
1889- RecordCacheArray [typmod ]!= NULL )
1889+ RecordCacheArray [typmod ]. tupdesc != NULL )
18901890{
1891- Assert (RecordIdentifierArray [typmod ]!= 0 );
1892- return RecordIdentifierArray [typmod ];
1891+ Assert (RecordCacheArray [typmod ]. id != 0 );
1892+ return RecordCacheArray [typmod ]. id ;
18931893}
18941894
18951895/* For anonymous or unrecognized record type, generate a new ID */
@@ -1969,7 +1969,7 @@ SharedRecordTypmodRegistryInit(SharedRecordTypmodRegistry *registry,
19691969TupleDesc tupdesc ;
19701970bool found ;
19711971
1972- tupdesc = RecordCacheArray [typmod ];
1972+ tupdesc = RecordCacheArray [typmod ]. tupdesc ;
19731973if (tupdesc == NULL )
19741974continue ;
19751975