aboutsummaryrefslogtreecommitdiff
path: root/src/backend/utils/cache
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/utils/cache')
-rw-r--r--src/backend/utils/cache/catcache.c5
-rw-r--r--src/backend/utils/cache/relcache.c55
-rw-r--r--src/backend/utils/cache/typcache.c7
3 files changed, 39 insertions, 28 deletions
diff --git a/src/backend/utils/cache/catcache.c b/src/backend/utils/cache/catcache.c
index f894053d806..e0928010257 100644
--- a/src/backend/utils/cache/catcache.c
+++ b/src/backend/utils/cache/catcache.c
@@ -797,7 +797,7 @@ do { \
if (cache->cc_key[i] > 0) { \
elog(DEBUG2, "CatalogCacheInitializeCache: load %d/%d w/%d, %u", \
i+1, cache->cc_nkeys, cache->cc_key[i], \
- tupdesc->attrs[cache->cc_key[i] - 1]->atttypid); \
+ TupleDescAttr(tupdesc, cache->cc_key[i] - 1)->atttypid); \
} else { \
elog(DEBUG2, "CatalogCacheInitializeCache: load %d/%d w/%d", \
i+1, cache->cc_nkeys, cache->cc_key[i]); \
@@ -862,7 +862,8 @@ CatalogCacheInitializeCache(CatCache *cache)
if (cache->cc_key[i] > 0)
{
- Form_pg_attribute attr = tupdesc->attrs[cache->cc_key[i] - 1];
+ Form_pg_attribute attr = TupleDescAttr(tupdesc,
+ cache->cc_key[i] - 1);
keytype = attr->atttypid;
/* cache key columns should always be NOT NULL */
diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c
index 2150fe9a396..b8e37809b05 100644
--- a/src/backend/utils/cache/relcache.c
+++ b/src/backend/utils/cache/relcache.c
@@ -546,7 +546,7 @@ RelationBuildTupleDesc(Relation relation)
elog(ERROR, "invalid attribute number %d for %s",
attp->attnum, RelationGetRelationName(relation));
- memcpy(relation->rd_att->attrs[attp->attnum - 1],
+ memcpy(TupleDescAttr(relation->rd_att, attp->attnum - 1),
attp,
ATTRIBUTE_FIXED_PART_SIZE);
@@ -590,7 +590,7 @@ RelationBuildTupleDesc(Relation relation)
int i;
for (i = 0; i < relation->rd_rel->relnatts; i++)
- Assert(relation->rd_att->attrs[i]->attcacheoff == -1);
+ Assert(TupleDescAttr(relation->rd_att, i)->attcacheoff == -1);
}
#endif
@@ -600,7 +600,7 @@ RelationBuildTupleDesc(Relation relation)
* for attnum=1 that used to exist in fastgetattr() and index_getattr().
*/
if (relation->rd_rel->relnatts > 0)
- relation->rd_att->attrs[0]->attcacheoff = 0;
+ TupleDescAttr(relation->rd_att, 0)->attcacheoff = 0;
/*
* Set up constraint/default info
@@ -958,9 +958,11 @@ RelationBuildPartitionKey(Relation relation)
/* Collect type information */
if (attno != 0)
{
- key->parttypid[i] = relation->rd_att->attrs[attno - 1]->atttypid;
- key->parttypmod[i] = relation->rd_att->attrs[attno - 1]->atttypmod;
- key->parttypcoll[i] = relation->rd_att->attrs[attno - 1]->attcollation;
+ Form_pg_attribute att = TupleDescAttr(relation->rd_att, attno - 1);
+
+ key->parttypid[i] = att->atttypid;
+ key->parttypmod[i] = att->atttypmod;
+ key->parttypcoll[i] = att->attcollation;
}
else
{
@@ -1977,16 +1979,16 @@ formrdesc(const char *relationName, Oid relationReltype,
has_not_null = false;
for (i = 0; i < natts; i++)
{
- memcpy(relation->rd_att->attrs[i],
+ memcpy(TupleDescAttr(relation->rd_att, i),
&attrs[i],
ATTRIBUTE_FIXED_PART_SIZE);
has_not_null |= attrs[i].attnotnull;
/* make sure attcacheoff is valid */
- relation->rd_att->attrs[i]->attcacheoff = -1;
+ TupleDescAttr(relation->rd_att, i)->attcacheoff = -1;
}
/* initialize first attribute's attcacheoff, cf RelationBuildTupleDesc */
- relation->rd_att->attrs[0]->attcacheoff = 0;
+ TupleDescAttr(relation->rd_att, 0)->attcacheoff = 0;
/* mark not-null status */
if (has_not_null)
@@ -2000,7 +2002,7 @@ formrdesc(const char *relationName, Oid relationReltype,
/*
* initialize relation id from info in att array (my, this is ugly)
*/
- RelationGetRelid(relation) = relation->rd_att->attrs[0]->attrelid;
+ RelationGetRelid(relation) = TupleDescAttr(relation->rd_att, 0)->attrelid;
/*
* All relations made with formrdesc are mapped. This is necessarily so
@@ -3274,9 +3276,12 @@ RelationBuildLocalRelation(const char *relname,
has_not_null = false;
for (i = 0; i < natts; i++)
{
- rel->rd_att->attrs[i]->attidentity = tupDesc->attrs[i]->attidentity;
- rel->rd_att->attrs[i]->attnotnull = tupDesc->attrs[i]->attnotnull;
- has_not_null |= tupDesc->attrs[i]->attnotnull;
+ Form_pg_attribute satt = TupleDescAttr(tupDesc, i);
+ Form_pg_attribute datt = TupleDescAttr(rel->rd_att, i);
+
+ datt->attidentity = satt->attidentity;
+ datt->attnotnull = satt->attnotnull;
+ has_not_null |= satt->attnotnull;
}
if (has_not_null)
@@ -3346,7 +3351,7 @@ RelationBuildLocalRelation(const char *relname,
RelationGetRelid(rel) = relid;
for (i = 0; i < natts; i++)
- rel->rd_att->attrs[i]->attrelid = relid;
+ TupleDescAttr(rel->rd_att, i)->attrelid = relid;
rel->rd_rel->reltablespace = reltablespace;
@@ -3971,13 +3976,13 @@ BuildHardcodedDescriptor(int natts, const FormData_pg_attribute *attrs,
for (i = 0; i < natts; i++)
{
- memcpy(result->attrs[i], &attrs[i], ATTRIBUTE_FIXED_PART_SIZE);
+ memcpy(TupleDescAttr(result, i), &attrs[i], ATTRIBUTE_FIXED_PART_SIZE);
/* make sure attcacheoff is valid */
- result->attrs[i]->attcacheoff = -1;
+ TupleDescAttr(result, i)->attcacheoff = -1;
}
/* initialize first attribute's attcacheoff, cf RelationBuildTupleDesc */
- result->attrs[0]->attcacheoff = 0;
+ TupleDescAttr(result, 0)->attcacheoff = 0;
/* Note: we don't bother to set up a TupleConstr entry */
@@ -4044,6 +4049,7 @@ AttrDefaultFetch(Relation relation)
while (HeapTupleIsValid(htup = systable_getnext(adscan)))
{
Form_pg_attrdef adform = (Form_pg_attrdef) GETSTRUCT(htup);
+ Form_pg_attribute attr = TupleDescAttr(relation->rd_att, adform->adnum - 1);
for (i = 0; i < ndef; i++)
{
@@ -4051,7 +4057,7 @@ AttrDefaultFetch(Relation relation)
continue;
if (attrdef[i].adbin != NULL)
elog(WARNING, "multiple attrdef records found for attr %s of rel %s",
- NameStr(relation->rd_att->attrs[adform->adnum - 1]->attname),
+ NameStr(attr->attname),
RelationGetRelationName(relation));
else
found++;
@@ -4061,7 +4067,7 @@ AttrDefaultFetch(Relation relation)
adrel->rd_att, &isnull);
if (isnull)
elog(WARNING, "null adbin for attr %s of rel %s",
- NameStr(relation->rd_att->attrs[adform->adnum - 1]->attname),
+ NameStr(attr->attname),
RelationGetRelationName(relation));
else
{
@@ -5270,7 +5276,7 @@ errtablecol(Relation rel, int attnum)
/* Use reldesc if it's a user attribute, else consult the catalogs */
if (attnum > 0 && attnum <= reldesc->natts)
- colname = NameStr(reldesc->attrs[attnum - 1]->attname);
+ colname = NameStr(TupleDescAttr(reldesc, attnum - 1)->attname);
else
colname = get_relid_attribute_name(RelationGetRelid(rel), attnum);
@@ -5460,14 +5466,16 @@ load_relcache_init_file(bool shared)
has_not_null = false;
for (i = 0; i < relform->relnatts; i++)
{
+ Form_pg_attribute attr = TupleDescAttr(rel->rd_att, i);
+
if (fread(&len, 1, sizeof(len), fp) != sizeof(len))
goto read_failed;
if (len != ATTRIBUTE_FIXED_PART_SIZE)
goto read_failed;
- if (fread(rel->rd_att->attrs[i], 1, len, fp) != len)
+ if (fread(attr, 1, len, fp) != len)
goto read_failed;
- has_not_null |= rel->rd_att->attrs[i]->attnotnull;
+ has_not_null |= attr->attnotnull;
}
/* next read the access method specific field */
@@ -5848,7 +5856,8 @@ write_relcache_init_file(bool shared)
/* next, do all the attribute tuple form data entries */
for (i = 0; i < relform->relnatts; i++)
{
- write_item(rel->rd_att->attrs[i], ATTRIBUTE_FIXED_PART_SIZE, fp);
+ write_item(TupleDescAttr(rel->rd_att, i),
+ ATTRIBUTE_FIXED_PART_SIZE, fp);
}
/* next, do the access method specific field */
diff --git a/src/backend/utils/cache/typcache.c b/src/backend/utils/cache/typcache.c
index 7ec31eb3e32..20567a394b2 100644
--- a/src/backend/utils/cache/typcache.c
+++ b/src/backend/utils/cache/typcache.c
@@ -1176,11 +1176,12 @@ cache_record_field_properties(TypeCacheEntry *typentry)
for (i = 0; i < tupdesc->natts; i++)
{
TypeCacheEntry *fieldentry;
+ Form_pg_attribute attr = TupleDescAttr(tupdesc, i);
- if (tupdesc->attrs[i]->attisdropped)
+ if (attr->attisdropped)
continue;
- fieldentry = lookup_type_cache(tupdesc->attrs[i]->atttypid,
+ fieldentry = lookup_type_cache(attr->atttypid,
TYPECACHE_EQ_OPR |
TYPECACHE_CMP_PROC);
if (!OidIsValid(fieldentry->eq_opr))
@@ -1340,7 +1341,7 @@ assign_record_type_typmod(TupleDesc tupDesc)
{
if (i >= REC_HASH_KEYS)
break;
- hashkey[i] = tupDesc->attrs[i]->atttypid;
+ hashkey[i] = TupleDescAttr(tupDesc, i)->atttypid;
}
recentry = (RecordCacheEntry *) hash_search(RecordCacheHash,
(void *) hashkey,