@ -273,10 +273,15 @@ static const dshash_parameters srtr_typmod_table_params = {
/* hashtable for recognizing registered record types */
static HTAB * RecordCacheHash = NULL ;
/* arrays of info about registered record types, indexed by assigned typmod */
static TupleDesc * RecordCacheArray = NULL ;
static uint64 * RecordIdentifierArray = NULL ;
static int32 RecordCacheArrayLen = 0 ; /* allocated length of above arrays */
typedef struct RecordCacheArrayEntry
{
uint64 id ;
TupleDesc tupdesc ;
} RecordCacheArrayEntry ;
/* array of info about registered record types, indexed by assigned typmod */
static RecordCacheArrayEntry * RecordCacheArray = NULL ;
static int32 RecordCacheArrayLen = 0 ; /* allocated length of above array */
static int32 NextRecordTypmod = 0 ; /* number of entries used */
/*
@ -1703,10 +1708,9 @@ ensure_record_cache_typmod_slot_exists(int32 typmod)
{
if ( RecordCacheArray = = NULL )
{
RecordCacheArray = ( TupleDesc * )
MemoryContextAllocZero ( CacheMemoryContext , 64 * sizeof ( TupleDesc ) ) ;
RecordIdentifierArray = ( uint64 * )
MemoryContextAllocZero ( CacheMemoryContext , 64 * sizeof ( uint64 ) ) ;
RecordCacheArray = ( RecordCacheArrayEntry * )
MemoryContextAllocZero ( CacheMemoryContext ,
64 * sizeof ( RecordCacheArrayEntry ) ) ;
RecordCacheArrayLen = 64 ;
}
@ -1714,8 +1718,10 @@ ensure_record_cache_typmod_slot_exists(int32 typmod)
{
int32 newlen = pg_nextpower2_32 ( typmod + 1 ) ;
RecordCacheArray = repalloc0_array ( RecordCacheArray , TupleDesc , RecordCacheArrayLen , newlen ) ;
RecordIdentifierArray = repalloc0_array ( RecordIdentifierArray , uint64 , RecordCacheArrayLen , newlen ) ;
RecordCacheArray = repalloc0_array ( RecordCacheArray ,
RecordCacheArrayEntry ,
RecordCacheArrayLen ,
newlen ) ;
RecordCacheArrayLen = newlen ;
}
}
@ -1753,8 +1759,8 @@ lookup_rowtype_tupdesc_internal(Oid type_id, int32 typmod, bool noError)
{
/* It is already in our local cache? */
if ( typmod < RecordCacheArrayLen & &
RecordCacheArray [ typmod ] ! = NULL )
return RecordCacheArray [ typmod ] ;
RecordCacheArray [ typmod ] . tupdesc ! = NULL )
return RecordCacheArray [ typmod ] . tupdesc ;
/* Are we attached to a shared record typmod registry? */
if ( CurrentSession - > shared_typmod_registry ! = NULL )
@ -1780,19 +1786,19 @@ lookup_rowtype_tupdesc_internal(Oid type_id, int32 typmod, bool noError)
* Our local array can now point directly to the TupleDesc
* in shared memory , which is non - reference - counted .
*/
RecordCacheArray [ typmod ] = tupdesc ;
RecordCacheArray [ typmod ] . tupdesc = tupdesc ;
Assert ( tupdesc - > tdrefcount = = - 1 ) ;
/*
* We don ' t share tupdesc identifiers across processes , so
* assign one locally .
*/
RecordIdentifier Array [ typmod ] = + + tupledesc_id_counter ;
RecordCache Array [ typmod ] . id = + + tupledesc_id_counter ;
dshash_release_lock ( CurrentSession - > shared_typmod_table ,
entry ) ;
return RecordCacheArray [ typmod ] ;
return RecordCacheArray [ typmod ] . tupdesc ;
}
}
}
@ -2005,10 +2011,10 @@ assign_record_type_typmod(TupleDesc tupDesc)
ensure_record_cache_typmod_slot_exists ( entDesc - > tdtypmod ) ;
}
RecordCacheArray [ entDesc - > tdtypmod ] = entDesc ;
RecordCacheArray [ entDesc - > tdtypmod ] . tupdesc = entDesc ;
/* Assign a unique tupdesc identifier, too. */
RecordIdentifier Array [ entDesc - > tdtypmod ] = + + tupledesc_id_counter ;
RecordCache Array [ entDesc - > tdtypmod ] . id = + + tupledesc_id_counter ;
/* Fully initialized; create the hash table entry */
recentry = ( RecordCacheEntry * ) hash_search ( RecordCacheHash ,
@ -2057,10 +2063,10 @@ assign_record_type_identifier(Oid type_id, int32 typmod)
* It ' s a transient record type , so look in our record - type table .
*/
if ( typmod > = 0 & & typmod < RecordCacheArrayLen & &
RecordCacheArray [ typmod ] ! = NULL )
RecordCacheArray [ typmod ] . tupdesc ! = NULL )
{
Assert ( RecordIdentifier Array [ typmod ] ! = 0 ) ;
return RecordIdentifier Array [ typmod ] ;
Assert ( RecordCache Array [ typmod ] . id ! = 0 ) ;
return RecordCache Array [ typmod ] . id ;
}
/* For anonymous or unrecognized record type, generate a new ID */
@ -2140,7 +2146,7 @@ SharedRecordTypmodRegistryInit(SharedRecordTypmodRegistry *registry,
TupleDesc tupdesc ;
bool found ;
tupdesc = RecordCacheArray [ typmod ] ;
tupdesc = RecordCacheArray [ typmod ] . tupdesc ;
if ( tupdesc = = NULL )
continue ;