@ -39,7 +39,6 @@
# include "catalog/index.h"
# include "catalog/indexing.h"
# include "catalog/namespace.h"
# include "catalog/pg_amop.h"
# include "catalog/pg_amproc.h"
# include "catalog/pg_attrdef.h"
# include "catalog/pg_authid.h"
@ -48,7 +47,6 @@
# include "catalog/pg_database.h"
# include "catalog/pg_namespace.h"
# include "catalog/pg_opclass.h"
# include "catalog/pg_operator.h"
# include "catalog/pg_proc.h"
# include "catalog/pg_rewrite.h"
# include "catalog/pg_tablespace.h"
@ -84,10 +82,10 @@
*/
# define RELCACHE_INIT_FILENAME "pg_internal.init"
# define RELCACHE_INIT_FILEMAGIC 0x573265 /* version ID value */
# define RELCACHE_INIT_FILEMAGIC 0x573266 /* version ID value */
/*
* hardcoded tuple descriptors , generated by genbki . pl
* hardcoded tuple descriptors , contents generated by genbki . pl
*/
static const FormData_pg_attribute Desc_pg_class [ Natts_pg_class ] = { Schema_pg_class } ;
static const FormData_pg_attribute Desc_pg_attribute [ Natts_pg_attribute ] = { Schema_pg_attribute } ;
@ -185,19 +183,17 @@ do { \
/*
* Special cache for opclass - related information
*
* Note : only default operators and support procs get cached , ie , those with
* Note : only default support procs get cached , ie , those with
* lefttype = righttype = opcintype .
*/
typedef struct opclasscacheent
{
Oid opclassoid ; /* lookup key: OID of opclass */
bool valid ; /* set TRUE after successful fill-in */
StrategyNumber numStrats ; /* max # of strategies (from pg_am) */
StrategyNumber numSupport ; /* max # of support procs (from pg_am) */
Oid opcfamily ; /* OID of opclass's family */
Oid opcintype ; /* OID of opclass's declared input type */
Oid * operatorOids ; /* strategy operators' OIDs */
RegProcedure * supportProcs ; /* support procs */
RegProcedure * supportProcs ; /* OIDs of support procedures */
} OpClassCacheEnt ;
static HTAB * OpClassCache = NULL ;
@ -231,15 +227,12 @@ static void AttrDefaultFetch(Relation relation);
static void CheckConstraintFetch ( Relation relation ) ;
static List * insert_ordered_oid ( List * list , Oid datum ) ;
static void IndexSupportInitialize ( oidvector * indclass ,
Oid * indexOperator ,
RegProcedure * indexSupport ,
Oid * opFamily ,
Oid * opcInType ,
StrategyNumber maxStrategyNumber ,
StrategyNumber maxSupportNumber ,
AttrNumber maxAttributeNumber ) ;
static OpClassCacheEnt * LookupOpclassInfo ( Oid operatorClassOid ,
StrategyNumber numStrats ,
StrategyNumber numSupport ) ;
static void RelationCacheInitFileRemoveInDir ( const char * tblspcpath ) ;
static void unlink_initfile ( const char * initfilename ) ;
@ -980,7 +973,6 @@ RelationInitIndexAccessInfo(Relation relation)
MemoryContext indexcxt ;
MemoryContext oldcontext ;
int natts ;
uint16 amstrategies ;
uint16 amsupport ;
/*
@ -1015,7 +1007,6 @@ RelationInitIndexAccessInfo(Relation relation)
if ( natts ! = relation - > rd_index - > indnatts )
elog ( ERROR , " relnatts disagrees with indnatts for index %u " ,
RelationGetRelid ( relation ) ) ;
amstrategies = aform - > amstrategies ;
amsupport = aform - > amsupport ;
/*
@ -1044,13 +1035,6 @@ RelationInitIndexAccessInfo(Relation relation)
relation - > rd_opcintype = ( Oid * )
MemoryContextAllocZero ( indexcxt , natts * sizeof ( Oid ) ) ;
if ( amstrategies > 0 )
relation - > rd_operator = ( Oid * )
MemoryContextAllocZero ( indexcxt ,
natts * amstrategies * sizeof ( Oid ) ) ;
else
relation - > rd_operator = NULL ;
if ( amsupport > 0 )
{
int nsupport = natts * amsupport ;
@ -1082,14 +1066,13 @@ RelationInitIndexAccessInfo(Relation relation)
indclass = ( oidvector * ) DatumGetPointer ( indclassDatum ) ;
/*
* Fill the operator and support procedure OID arrays , as well as the info
* about opfamilies and opclass input types . ( aminfo and supportinfo are
* left as zeroes , and are filled on - the - fly when used )
* Fill the support procedure OID array , as well as the info about
* opfamilies and opclass input types . ( aminfo and supportinfo are left
* as zeroes , and are filled on - the - fly when used )
*/
IndexSupportInitialize ( indclass ,
relation - > rd_operator , relation - > rd_support ,
IndexSupportInitialize ( indclass , relation - > rd_support ,
relation - > rd_opfamily , relation - > rd_opcintype ,
amstrategies , ams upport , natts ) ;
amsupport , natts ) ;
/*
* Similarly extract indoption and copy it to the cache entry
@ -1118,22 +1101,19 @@ RelationInitIndexAccessInfo(Relation relation)
* Initializes an index ' s cached opclass information ,
* given the index ' s pg_index . indclass entry .
*
* Data is returned into * indexOperator , * index Support , * opFamily , and
* * opcInType , which are arrays allocated by the caller .
* Data is returned into * indexSupport , * opFamily , and * opcInType ,
* which are arrays allocated by the caller .
*
* The caller also passes maxStrategyNumber , maxSupportNumber , and
* maxAttributeNumber , since these indicate the size of the arrays
* it has allocated - - - but in practice these numbers must always match
* those obtainable from the system catalog entries for the index and
* access method .
* The caller also passes maxSupportNumber and maxAttributeNumber , since these
* indicate the size of the arrays it has allocated - - - but in practice these
* numbers must always match those obtainable from the system catalog entries
* for the index and access method .
*/
static void
IndexSupportInitialize ( oidvector * indclass ,
Oid * indexOperator ,
RegProcedure * indexSupport ,
Oid * opFamily ,
Oid * opcInType ,
StrategyNumber maxStrategyNumber ,
StrategyNumber maxSupportNumber ,
AttrNumber maxAttributeNumber )
{
@ -1148,16 +1128,11 @@ IndexSupportInitialize(oidvector *indclass,
/* look up the info for this opclass, using a cache */
opcentry = LookupOpclassInfo ( indclass - > values [ attIndex ] ,
maxStrategyNumber ,
maxSupportNumber ) ;
/* copy cached data into relcache entry */
opFamily [ attIndex ] = opcentry - > opcfamily ;
opcInType [ attIndex ] = opcentry - > opcintype ;
if ( maxStrategyNumber > 0 )
memcpy ( & indexOperator [ attIndex * maxStrategyNumber ] ,
opcentry - > operatorOids ,
maxStrategyNumber * sizeof ( Oid ) ) ;
if ( maxSupportNumber > 0 )
memcpy ( & indexSupport [ attIndex * maxSupportNumber ] ,
opcentry - > supportProcs ,
@ -1171,9 +1146,9 @@ IndexSupportInitialize(oidvector *indclass,
* This routine maintains a per - opclass cache of the information needed
* by IndexSupportInitialize ( ) . This is more efficient than relying on
* the catalog cache , because we can load all the info about a particular
* opclass in a single indexscan of pg_amproc or pg_amop .
* opclass in a single indexscan of pg_amproc .
*
* The information from pg_am about expected range of strategy and support
* The information from pg_am about expected range of support function
* numbers is passed in , rather than being looked up , mainly because the
* caller will have it already .
*
@ -1187,7 +1162,6 @@ IndexSupportInitialize(oidvector *indclass,
*/
static OpClassCacheEnt *
LookupOpclassInfo ( Oid operatorClassOid ,
StrategyNumber numStrats ,
StrategyNumber numSupport )
{
OpClassCacheEnt * opcentry ;
@ -1223,16 +1197,8 @@ LookupOpclassInfo(Oid operatorClassOid,
{
/* Need to allocate memory for new entry */
opcentry - > valid = false ; /* until known OK */
opcentry - > numStrats = numStrats ;
opcentry - > numSupport = numSupport ;
if ( numStrats > 0 )
opcentry - > operatorOids = ( Oid * )
MemoryContextAllocZero ( CacheMemoryContext ,
numStrats * sizeof ( Oid ) ) ;
else
opcentry - > operatorOids = NULL ;
if ( numSupport > 0 )
opcentry - > supportProcs = ( RegProcedure * )
MemoryContextAllocZero ( CacheMemoryContext ,
@ -1242,7 +1208,6 @@ LookupOpclassInfo(Oid operatorClassOid,
}
else
{
Assert ( numStrats = = opcentry - > numStrats ) ;
Assert ( numSupport = = opcentry - > numSupport ) ;
}
@ -1273,7 +1238,7 @@ LookupOpclassInfo(Oid operatorClassOid,
/*
* We have to fetch the pg_opclass row to determine its opfamily and
* opcintype , which are needed to look up th e operators and functions .
* opcintype , which are needed to look up rela ted operators and functions .
* It ' d be convenient to use the syscache here , but that probably doesn ' t
* work while bootstrapping .
*/
@ -1298,45 +1263,6 @@ LookupOpclassInfo(Oid operatorClassOid,
systable_endscan ( scan ) ;
heap_close ( rel , AccessShareLock ) ;
/*
* Scan pg_amop to obtain operators for the opclass . We only fetch the
* default ones ( those with lefttype = righttype = opcintype ) .
*/
if ( numStrats > 0 )
{
ScanKeyInit ( & skey [ 0 ] ,
Anum_pg_amop_amopfamily ,
BTEqualStrategyNumber , F_OIDEQ ,
ObjectIdGetDatum ( opcentry - > opcfamily ) ) ;
ScanKeyInit ( & skey [ 1 ] ,
Anum_pg_amop_amoplefttype ,
BTEqualStrategyNumber , F_OIDEQ ,
ObjectIdGetDatum ( opcentry - > opcintype ) ) ;
ScanKeyInit ( & skey [ 2 ] ,
Anum_pg_amop_amoprighttype ,
BTEqualStrategyNumber , F_OIDEQ ,
ObjectIdGetDatum ( opcentry - > opcintype ) ) ;
rel = heap_open ( AccessMethodOperatorRelationId , AccessShareLock ) ;
scan = systable_beginscan ( rel , AccessMethodStrategyIndexId , indexOK ,
SnapshotNow , 3 , skey ) ;
while ( HeapTupleIsValid ( htup = systable_getnext ( scan ) ) )
{
Form_pg_amop amopform = ( Form_pg_amop ) GETSTRUCT ( htup ) ;
if ( amopform - > amopstrategy < = 0 | |
( StrategyNumber ) amopform - > amopstrategy > numStrats )
elog ( ERROR , " invalid amopstrategy number %d for opclass %u " ,
amopform - > amopstrategy , operatorClassOid ) ;
opcentry - > operatorOids [ amopform - > amopstrategy - 1 ] =
amopform - > amopopr ;
}
systable_endscan ( scan ) ;
heap_close ( rel , AccessShareLock ) ;
}
/*
* Scan pg_amproc to obtain support procs for the opclass . We only fetch
* the default ones ( those with lefttype = righttype = opcintype ) .
@ -2907,18 +2833,14 @@ RelationCacheInitializePhase3(void)
IndexRelationId ) ;
load_critical_index ( OpclassOidIndexId ,
OperatorClassRelationId ) ;
load_critical_index ( AccessMethodStrategyIndexId ,
AccessMethodOperatorRelationId ) ;
load_critical_index ( AccessMethodProcedureIndexId ,
AccessMethodProcedureRelationId ) ;
load_critical_index ( OperatorOidIndexId ,
OperatorRelationId ) ;
load_critical_index ( RewriteRelRulenameIndexId ,
RewriteRelationId ) ;
load_critical_index ( TriggerRelidNameIndexId ,
TriggerRelationId ) ;
# define NUM_CRITICAL_LOCAL_INDEXES 9 /* fix if you change list above */
# define NUM_CRITICAL_LOCAL_INDEXES 7 /* fix if you change list above */
criticalRelcachesBuilt = true ;
}
@ -4044,7 +3966,6 @@ load_relcache_init_file(bool shared)
MemoryContext indexcxt ;
Oid * opfamily ;
Oid * opcintype ;
Oid * operator ;
RegProcedure * support ;
int nsupport ;
int16 * indoption ;
@ -4105,17 +4026,7 @@ load_relcache_init_file(bool shared)
rel - > rd_opcintype = opcintype ;
/* next, read the vector of operator OIDs */
if ( fread ( & len , 1 , sizeof ( len ) , fp ) ! = sizeof ( len ) )
goto read_failed ;
operator = ( Oid * ) MemoryContextAlloc ( indexcxt , len ) ;
if ( fread ( operator , 1 , len , fp ) ! = len )
goto read_failed ;
rel - > rd_operator = operator ;
/* next, read the vector of support procedures */
/* next, read the vector of support procedure OIDs */
if ( fread ( & len , 1 , sizeof ( len ) , fp ) ! = sizeof ( len ) )
goto read_failed ;
support = ( RegProcedure * ) MemoryContextAlloc ( indexcxt , len ) ;
@ -4154,7 +4065,6 @@ load_relcache_init_file(bool shared)
Assert ( rel - > rd_aminfo = = NULL ) ;
Assert ( rel - > rd_opfamily = = NULL ) ;
Assert ( rel - > rd_opcintype = = NULL ) ;
Assert ( rel - > rd_operator = = NULL ) ;
Assert ( rel - > rd_support = = NULL ) ;
Assert ( rel - > rd_supportinfo = = NULL ) ;
Assert ( rel - > rd_indoption = = NULL ) ;
@ -4371,12 +4281,7 @@ write_relcache_init_file(bool shared)
relform - > relnatts * sizeof ( Oid ) ,
fp ) ;
/* next, write the vector of operator OIDs */
write_item ( rel - > rd_operator ,
relform - > relnatts * ( am - > amstrategies * sizeof ( Oid ) ) ,
fp ) ;
/* next, write the vector of support procedures */
/* next, write the vector of support procedure OIDs */
write_item ( rel - > rd_support ,
relform - > relnatts * ( am - > amsupport * sizeof ( RegProcedure ) ) ,
fp ) ;