@@ -262,10 +262,15 @@ static const dshash_parameters srtr_typmod_table_params = {
262
262
/* hashtable for recognizing registered record types */
263
263
static HTAB * RecordCacheHash = NULL ;
264
264
265
- /* arrays of info about registered record types, indexed by assigned typmod */
266
- static TupleDesc * RecordCacheArray = NULL ;
267
- static uint64 * RecordIdentifierArray = NULL ;
268
- static int32 RecordCacheArrayLen = 0 ; /* allocated length of above arrays */
265
+ typedef struct RecordCacheArrayEntry
266
+ {
267
+ uint64 id ;
268
+ TupleDesc tupdesc ;
269
+ } RecordCacheArrayEntry ;
270
+
271
+ /* array of info about registered record types, indexed by assigned typmod */
272
+ static RecordCacheArrayEntry * RecordCacheArray = NULL ;
273
+ static int32 RecordCacheArrayLen = 0 ; /* allocated length of above array */
269
274
static int32 NextRecordTypmod = 0 ; /* number of entries used */
270
275
271
276
/*
@@ -1514,10 +1519,8 @@ ensure_record_cache_typmod_slot_exists(int32 typmod)
1514
1519
{
1515
1520
if (RecordCacheArray == NULL )
1516
1521
{
1517
- RecordCacheArray = (TupleDesc * )
1518
- MemoryContextAllocZero (CacheMemoryContext , 64 * sizeof (TupleDesc ));
1519
- RecordIdentifierArray = (uint64 * )
1520
- MemoryContextAllocZero (CacheMemoryContext , 64 * sizeof (uint64 ));
1522
+ RecordCacheArray = (RecordCacheArrayEntry * )
1523
+ MemoryContextAllocZero (CacheMemoryContext , 64 * sizeof (RecordCacheArrayEntry ));
1521
1524
RecordCacheArrayLen = 64 ;
1522
1525
}
1523
1526
@@ -1528,14 +1531,11 @@ ensure_record_cache_typmod_slot_exists(int32 typmod)
1528
1531
while (typmod >= newlen )
1529
1532
newlen *= 2 ;
1530
1533
1531
- RecordCacheArray = (TupleDesc * ) repalloc (RecordCacheArray ,
1532
- newlen * sizeof (TupleDesc ));
1534
+ RecordCacheArray = (RecordCacheArrayEntry * )
1535
+ repalloc (RecordCacheArray ,
1536
+ newlen * sizeof (RecordCacheArrayEntry ));
1533
1537
memset (RecordCacheArray + RecordCacheArrayLen , 0 ,
1534
- (newlen - RecordCacheArrayLen ) * sizeof (TupleDesc ));
1535
- RecordIdentifierArray = (uint64 * ) repalloc (RecordIdentifierArray ,
1536
- newlen * sizeof (uint64 ));
1537
- memset (RecordIdentifierArray + RecordCacheArrayLen , 0 ,
1538
- (newlen - RecordCacheArrayLen ) * sizeof (uint64 ));
1538
+ (newlen - RecordCacheArrayLen ) * sizeof (RecordCacheArrayEntry ));
1539
1539
RecordCacheArrayLen = newlen ;
1540
1540
}
1541
1541
}
@@ -1573,8 +1573,8 @@ lookup_rowtype_tupdesc_internal(Oid type_id, int32 typmod, bool noError)
1573
1573
{
1574
1574
/* It is already in our local cache? */
1575
1575
if (typmod < RecordCacheArrayLen &&
1576
- RecordCacheArray [typmod ] != NULL )
1577
- return RecordCacheArray [typmod ];
1576
+ RecordCacheArray [typmod ]. tupdesc != NULL )
1577
+ return RecordCacheArray [typmod ]. tupdesc ;
1578
1578
1579
1579
/* Are we attached to a shared record typmod registry? */
1580
1580
if (CurrentSession -> shared_typmod_registry != NULL )
@@ -1600,19 +1600,19 @@ lookup_rowtype_tupdesc_internal(Oid type_id, int32 typmod, bool noError)
1600
1600
* Our local array can now point directly to the TupleDesc
1601
1601
* in shared memory, which is non-reference-counted.
1602
1602
*/
1603
- RecordCacheArray [typmod ] = tupdesc ;
1603
+ RecordCacheArray [typmod ]. tupdesc = tupdesc ;
1604
1604
Assert (tupdesc -> tdrefcount == -1 );
1605
1605
1606
1606
/*
1607
1607
* We don't share tupdesc identifiers across processes, so
1608
1608
* assign one locally.
1609
1609
*/
1610
- RecordIdentifierArray [typmod ] = ++ tupledesc_id_counter ;
1610
+ RecordCacheArray [typmod ]. id = ++ tupledesc_id_counter ;
1611
1611
1612
1612
dshash_release_lock (CurrentSession -> shared_typmod_table ,
1613
1613
entry );
1614
1614
1615
- return RecordCacheArray [typmod ];
1615
+ return RecordCacheArray [typmod ]. tupdesc ;
1616
1616
}
1617
1617
}
1618
1618
}
@@ -1823,10 +1823,10 @@ assign_record_type_typmod(TupleDesc tupDesc)
1823
1823
ensure_record_cache_typmod_slot_exists (entDesc -> tdtypmod );
1824
1824
}
1825
1825
1826
- RecordCacheArray [entDesc -> tdtypmod ] = entDesc ;
1826
+ RecordCacheArray [entDesc -> tdtypmod ]. tupdesc = entDesc ;
1827
1827
1828
1828
/* Assign a unique tupdesc identifier, too. */
1829
- RecordIdentifierArray [entDesc -> tdtypmod ] = ++ tupledesc_id_counter ;
1829
+ RecordCacheArray [entDesc -> tdtypmod ]. id = ++ tupledesc_id_counter ;
1830
1830
1831
1831
/* Fully initialized; create the hash table entry */
1832
1832
recentry = (RecordCacheEntry * ) hash_search (RecordCacheHash ,
@@ -1875,10 +1875,10 @@ assign_record_type_identifier(Oid type_id, int32 typmod)
1875
1875
* It's a transient record type, so look in our record-type table.
1876
1876
*/
1877
1877
if (typmod >= 0 && typmod < RecordCacheArrayLen &&
1878
- RecordCacheArray [typmod ] != NULL )
1878
+ RecordCacheArray [typmod ]. tupdesc != NULL )
1879
1879
{
1880
- Assert (RecordIdentifierArray [typmod ] != 0 );
1881
- return RecordIdentifierArray [t
57AE
ypmod ];
1880
+ Assert (RecordCacheArray [typmod ]. id != 0 );
1881
+ return RecordCacheArray [typmod ]. id ;
1882
1882
}
1883
1883
1884
1884
/* For anonymous or unrecognized record type, generate a new ID */
@@ -1958,7 +1958,7 @@ SharedRecordTypmodRegistryInit(SharedRecordTypmodRegistry *registry,
1958
1958
TupleDesc tupdesc ;
1959
1959
bool found ;
1960
1960
1961
- tupdesc = RecordCacheArray [typmod ];
1961
+ tupdesc = RecordCacheArray [typmod ]. tupdesc ;
1962
1962
if (tupdesc == NULL )
1963
1963
continue ;
1964
1964
0 commit comments