@@ -263,10 +263,15 @@ static const dshash_parameters srtr_typmod_table_params = {
263
263
/* hashtable for recognizing registered record types */
264
264
static HTAB * RecordCacheHash = NULL ;
265
265
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 */
270
275
static int32 NextRecordTypmod = 0 ; /* number of entries used */
271
276
272
277
/*
@@ -1525,10 +1530,8 @@ ensure_record_cache_typmod_slot_exists(int32 typmod)
1525
1530
{
1526
1531
if (RecordCacheArray == NULL )
1527
1532
{
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 ));
1532
1535
RecordCacheArrayLen = 64 ;
1533
1536
}
1534
1537
@@ -1539,14 +1542,11 @@ ensure_record_cache_typmod_slot_exists(int32 typmod)
1539
1542
while (typmod >= newlen )
1540
1543
newlen *= 2 ;
1541
1544
1542
- RecordCacheArray = (TupleDesc * ) repalloc (RecordCacheArray ,
1543
- newlen * sizeof (TupleDesc ));
1545
+ RecordCacheArray = (RecordCacheArrayEntry * )
1546
+ repalloc (RecordCacheArray ,
1547
+ newlen * sizeof (RecordCacheArrayEntry ));
1544
1548
memset (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 ));
1550
1550
RecordCacheArrayLen = newlen ;
1551
1551
}
1552
1552
}
@@ -1584,8 +1584,8 @@ lookup_rowtype_tupdesc_internal(Oid type_id, int32 typmod, bool noError)
1584
1584
{
1585
1585
/* It is already in our local cache? */
1586
1586
if (typmod < RecordCacheArrayLen &&
1587
- RecordCacheArray [typmod ] != NULL )
1588
- return RecordCacheArray [typmod ];
1587
+ RecordCacheArray [typmod ]. tupdesc != NULL )
1588
+ return RecordCacheArray [typmod ]. tupdesc ;
1589
1589
1590
1590
/* Are we attached to a shared record typmod registry? */
1591
1591
if (CurrentSession -> shared_typmod_registry != NULL )
@@ -1611,19 +1611,19 @@ lookup_rowtype_tupdesc_internal(Oid type_id, int32 typmod, bool noError)
1611
1611
* Our local array can now point directly to the TupleDesc
1612
1612
* in shared memory, which is non-reference-counted.
1613
1613
*/
1614
- RecordCacheArray [typmod ] = tupdesc ;
1614
+ RecordCacheArray [typmod ]. tupdesc = tupdesc ;
1615
1615
Assert (tupdesc -> tdrefcount == -1 );
1616
1616
1617
1617
/*
1618
1618
* We don't share tupdesc identifiers across processes, so
1619
1619
* assign one locally.
1620
1620
*/
1621
- RecordIdentifierArray [typmod ] = ++ tupledesc_id_counter ;
1621
+ RecordCacheArray [typmod ]. id = ++ tupledesc_id_counter ;
1622
1622
1623
1623
dshash_release_lock (CurrentSession -> shared_typmod_table ,
1624
1624
entry );
1625
1625
1626
- return RecordCacheArray [typmod ];
1626
+ return RecordCacheArray [typmod ]. tupdesc ;
1627
1627
}
1628
1628
}
1629
1629
}
@@ -1834,10 +1834,10 @@ assign_record_type_typmod(TupleDesc tupDesc)
1834
1834
ensure_record_cache_typmod_slot_exists (entDesc -> tdtypmod );
1835
1835
}
1836
1836
1837
- RecordCacheArray [entDesc -> tdtypmod ] = entDesc ;
1837
+ RecordCacheArray [entDesc -> tdtypmod ]. tupdesc = entDesc ;
1838
1838
1839
1839
/* Assign a unique tupdesc identifier, too. */
1840
- RecordIdentifierArray [entDesc -> tdtypmod ] = ++ tupledesc_id_counter ;
1840
+ RecordCacheArray [entDesc -> tdtypmod ]. id = ++ tupledesc_id_counter ;
1841
1841
1842
1842
/* Fully initialized; create the hash table entry */
1843
1843
recentry = (RecordCacheEntry * ) hash_search (RecordCacheHash ,
@@ -1886,10 +1886,10 @@ assign_record_type_identifier(Oid type_id, int32 typmod)
1886
1886
* It's a transient record type, so look in our record-type table.
1887
1887
*/
1888
1888
if (typmod >= 0 && typmod < RecordCacheArrayLen &&
1889
- RecordCacheArray [typmod ] != NULL )
1889
+ RecordCacheArray [typmod ]. tupdesc != NULL )
1890
1890
{
1891
- Assert (RecordIdentifierArray [typmod ] != 0 );
1892
- return RecordIdentifierArray [typmod ];
1891
+ Assert (RecordCacheArray [typmod ]. id != 0 );
1892
+ return RecordCacheArray [typmod ]. id ;
1893
1893
}
1894
1894
1895
1895
/* For anonymous or unrecognized record type, generate a new ID */
@@ -1969,7 +1969,7 @@ SharedRecordTypmodRegistryInit(SharedRecordTypmodRegistry *registry,
1969
1969
TupleDesc tupdesc ;
1970
1970
bool found ;
1971
1971
1972
- tupdesc = RecordCacheArray [typmod ];
1972
+ tupdesc = RecordCacheArray [typmod ]. tupdesc ;
1973
1973
if (tupdesc == NULL )
1974
1974
continue ;
1975
1975
0 commit comments