aboutsummaryrefslogtreecommitdiff
path: root/src/backend/utils
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/utils')
-rw-r--r--src/backend/utils/adt/json.c8
-rw-r--r--src/backend/utils/adt/jsonb.c8
-rw-r--r--src/backend/utils/adt/jsonfuncs.c2
-rw-r--r--src/backend/utils/adt/orderedsetaggs.c6
-rw-r--r--src/backend/utils/adt/rowtypes.c129
-rw-r--r--src/backend/utils/adt/ruleutils.c16
-rw-r--r--src/backend/utils/adt/tid.c6
-rw-r--r--src/backend/utils/adt/xml.c15
-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
-rw-r--r--src/backend/utils/fmgr/funcapi.c15
-rw-r--r--src/backend/utils/misc/pg_config.c4
13 files changed, 160 insertions, 116 deletions
diff --git a/src/backend/utils/adt/json.c b/src/backend/utils/adt/json.c
index 4dd7d977e8a..1ddb42b4d08 100644
--- a/src/backend/utils/adt/json.c
+++ b/src/backend/utils/adt/json.c
@@ -1714,15 +1714,16 @@ composite_to_json(Datum composite, StringInfo result, bool use_line_feeds)
char *attname;
JsonTypeCategory tcategory;
Oid outfuncoid;
+ Form_pg_attribute att = TupleDescAttr(tupdesc, i);
- if (tupdesc->attrs[i]->attisdropped)
+ if (att->attisdropped)
continue;
if (needsep)
appendStringInfoString(result, sep);
needsep = true;
- attname = NameStr(tupdesc->attrs[i]->attname);
+ attname = NameStr(att->attname);
escape_json(result, attname);
appendStringInfoChar(result, ':');
@@ -1734,8 +1735,7 @@ composite_to_json(Datum composite, StringInfo result, bool use_line_feeds)
outfuncoid = InvalidOid;
}
else
- json_categorize_type(tupdesc->attrs[i]->atttypid,
- &tcategory, &outfuncoid);
+ json_categorize_type(att->atttypid, &tcategory, &outfuncoid);
datum_to_json(val, isnull, result, tcategory, outfuncoid, false);
}
diff --git a/src/backend/utils/adt/jsonb.c b/src/backend/utils/adt/jsonb.c
index 49f41f9f999..1eb7f3d6f9d 100644
--- a/src/backend/utils/adt/jsonb.c
+++ b/src/backend/utils/adt/jsonb.c
@@ -1075,11 +1075,12 @@ composite_to_jsonb(Datum composite, JsonbInState *result)
JsonbTypeCategory tcategory;
Oid outfuncoid;
JsonbValue v;
+ Form_pg_attribute att = TupleDescAttr(tupdesc, i);
- if (tupdesc->attrs[i]->attisdropped)
+ if (att->attisdropped)
continue;
- attname = NameStr(tupdesc->attrs[i]->attname);
+ attname = NameStr(att->attname);
v.type = jbvString;
/* don't need checkStringLen here - can't exceed maximum name length */
@@ -1096,8 +1097,7 @@ composite_to_jsonb(Datum composite, JsonbInState *result)
outfuncoid = InvalidOid;
}
else
- jsonb_categorize_type(tupdesc->attrs[i]->atttypid,
- &tcategory, &outfuncoid);
+ jsonb_categorize_type(att->atttypid, &tcategory, &outfuncoid);
datum_to_jsonb(val, isnull, result, tcategory, outfuncoid, false);
}
diff --git a/src/backend/utils/adt/jsonfuncs.c b/src/backend/utils/adt/jsonfuncs.c
index 4779e74895c..d92ffa83d94 100644
--- a/src/backend/utils/adt/jsonfuncs.c
+++ b/src/backend/utils/adt/jsonfuncs.c
@@ -3087,7 +3087,7 @@ populate_record(TupleDesc tupdesc,
for (i = 0; i < ncolumns; ++i)
{
- Form_pg_attribute att = tupdesc->attrs[i];
+ Form_pg_attribute att = TupleDescAttr(tupdesc, i);
char *colname = NameStr(att->attname);
JsValue field = {0};
bool found;
diff --git a/src/backend/utils/adt/orderedsetaggs.c b/src/backend/utils/adt/orderedsetaggs.c
index 8502fcfc82e..25905a3287e 100644
--- a/src/backend/utils/adt/orderedsetaggs.c
+++ b/src/backend/utils/adt/orderedsetaggs.c
@@ -1125,13 +1125,15 @@ hypothetical_check_argtypes(FunctionCallInfo fcinfo, int nargs,
/* check that we have an int4 flag column */
if (!tupdesc ||
(nargs + 1) != tupdesc->natts ||
- tupdesc->attrs[nargs]->atttypid != INT4OID)
+ TupleDescAttr(tupdesc, nargs)->atttypid != INT4OID)
elog(ERROR, "type mismatch in hypothetical-set function");
/* check that direct args match in type with aggregated args */
for (i = 0; i < nargs; i++)
{
- if (get_fn_expr_argtype(fcinfo->flinfo, i + 1) != tupdesc->attrs[i]->atttypid)
+ Form_pg_attribute attr = TupleDescAttr(tupdesc, i);
+
+ if (get_fn_expr_argtype(fcinfo->flinfo, i + 1) != attr->atttypid)
elog(ERROR, "type mismatch in hypothetical-set function");
}
}
diff --git a/src/backend/utils/adt/rowtypes.c b/src/backend/utils/adt/rowtypes.c
index 44acd13c6b1..98fe00ff394 100644
--- a/src/backend/utils/adt/rowtypes.c
+++ b/src/backend/utils/adt/rowtypes.c
@@ -159,12 +159,13 @@ record_in(PG_FUNCTION_ARGS)
for (i = 0; i < ncolumns; i++)
{
+ Form_pg_attribute att = TupleDescAttr(tupdesc, i);
ColumnIOData *column_info = &my_extra->columns[i];
- Oid column_type = tupdesc->attrs[i]->atttypid;
+ Oid column_type = att->atttypid;
char *column_data;
/* Ignore dropped columns in datatype, but fill with nulls */
- if (tupdesc->attrs[i]->attisdropped)
+ if (att->attisdropped)
{
values[i] = (Datum) 0;
nulls[i] = true;
@@ -252,7 +253,7 @@ record_in(PG_FUNCTION_ARGS)
values[i] = InputFunctionCall(&column_info->proc,
column_data,
column_info->typioparam,
- tupdesc->attrs[i]->atttypmod);
+ att->atttypmod);
/*
* Prep for next column
@@ -367,15 +368,16 @@ record_out(PG_FUNCTION_ARGS)
for (i = 0; i < ncolumns; i++)
{
+ Form_pg_attribute att = TupleDescAttr(tupdesc, i);
ColumnIOData *column_info = &my_extra->columns[i];
- Oid column_type = tupdesc->attrs[i]->atttypid;
+ Oid column_type = att->atttypid;
Datum attr;
char *value;
char *tmp;
bool nq;
/* Ignore dropped columns in datatype */
- if (tupdesc->attrs[i]->attisdropped)
+ if (att->attisdropped)
continue;
if (needComma)
@@ -519,7 +521,7 @@ record_recv(PG_FUNCTION_ARGS)
validcols = 0;
for (i = 0; i < ncolumns; i++)
{
- if (!tupdesc->attrs[i]->attisdropped)
+ if (!TupleDescAttr(tupdesc, i)->attisdropped)
validcols++;
}
if (usercols != validcols)
@@ -531,8 +533,9 @@ record_recv(PG_FUNCTION_ARGS)
/* Process each column */
for (i = 0; i < ncolumns; i++)
{
+ Form_pg_attribute att = TupleDescAttr(tupdesc, i);
ColumnIOData *column_info = &my_extra->columns[i];
- Oid column_type = tupdesc->attrs[i]->atttypid;
+ Oid column_type = att->atttypid;
Oid coltypoid;
int itemlen;
StringInfoData item_buf;
@@ -540,7 +543,7 @@ record_recv(PG_FUNCTION_ARGS)
char csave;
/* Ignore dropped columns in datatype, but fill with nulls */
- if (tupdesc->attrs[i]->attisdropped)
+ if (att->attisdropped)
{
values[i] = (Datum) 0;
nulls[i] = true;
@@ -605,7 +608,7 @@ record_recv(PG_FUNCTION_ARGS)
values[i] = ReceiveFunctionCall(&column_info->proc,
bufptr,
column_info->typioparam,
- tupdesc->attrs[i]->atttypmod);
+ att->atttypmod);
if (bufptr)
{
@@ -712,20 +715,21 @@ record_send(PG_FUNCTION_ARGS)
validcols = 0;
for (i = 0; i < ncolumns; i++)
{
- if (!tupdesc->attrs[i]->attisdropped)
+ if (!TupleDescAttr(tupdesc, i)->attisdropped)
validcols++;
}
pq_sendint(&buf, validcols, 4);
for (i = 0; i < ncolumns; i++)
{
+ Form_pg_attribute att = TupleDescAttr(tupdesc, i);
ColumnIOData *column_info = &my_extra->columns[i];
- Oid column_type = tupdesc->attrs[i]->atttypid;
+ Oid column_type = att->atttypid;
Datum attr;
bytea *outputbytes;
/* Ignore dropped columns in datatype */
- if (tupdesc->attrs[i]->attisdropped)
+ if (att->attisdropped)
continue;
pq_sendint(&buf, column_type, sizeof(Oid));
@@ -873,18 +877,20 @@ record_cmp(FunctionCallInfo fcinfo)
i1 = i2 = j = 0;
while (i1 < ncolumns1 || i2 < ncolumns2)
{
+ Form_pg_attribute att1;
+ Form_pg_attribute att2;
TypeCacheEntry *typentry;
Oid collation;
/*
* Skip dropped columns
*/
- if (i1 < ncolumns1 && tupdesc1->attrs[i1]->attisdropped)
+ if (i1 < ncolumns1 && TupleDescAttr(tupdesc1, i1)->attisdropped)
{
i1++;
continue;
}
- if (i2 < ncolumns2 && tupdesc2->attrs[i2]->attisdropped)
+ if (i2 < ncolumns2 && TupleDescAttr(tupdesc2, i2)->attisdropped)
{
i2++;
continue;
@@ -892,24 +898,26 @@ record_cmp(FunctionCallInfo fcinfo)
if (i1 >= ncolumns1 || i2 >= ncolumns2)
break; /* we'll deal with mismatch below loop */
+ att1 = TupleDescAttr(tupdesc1, i1);
+ att2 = TupleDescAttr(tupdesc2, i2);
+
/*
* Have two matching columns, they must be same type
*/
- if (tupdesc1->attrs[i1]->atttypid !=
- tupdesc2->attrs[i2]->atttypid)
+ if (att1->atttypid != att2->atttypid)
ereport(ERROR,
(errcode(ERRCODE_DATATYPE_MISMATCH),
errmsg("cannot compare dissimilar column types %s and %s at record column %d",
- format_type_be(tupdesc1->attrs[i1]->atttypid),
- format_type_be(tupdesc2->attrs[i2]->atttypid),
+ format_type_be(att1->atttypid),
+ format_type_be(att2->atttypid),
j + 1)));
/*
* If they're not same collation, we don't complain here, but the
* comparison function might.
*/
- collation = tupdesc1->attrs[i1]->attcollation;
- if (collation != tupdesc2->attrs[i2]->attcollation)
+ collation = att1->attcollation;
+ if (collation != att2->attcollation)
collation = InvalidOid;
/*
@@ -917,9 +925,9 @@ record_cmp(FunctionCallInfo fcinfo)
*/
typentry = my_extra->columns[j].typentry;
if (typentry == NULL ||
- typentry->type_id != tupdesc1->attrs[i1]->atttypid)
+ typentry->type_id != att1->atttypid)
{
- typentry = lookup_type_cache(tupdesc1->attrs[i1]->atttypid,
+ typentry = lookup_type_cache(att1->atttypid,
TYPECACHE_CMP_PROC_FINFO);
if (!OidIsValid(typentry->cmp_proc_finfo.fn_oid))
ereport(ERROR,
@@ -1111,6 +1119,8 @@ record_eq(PG_FUNCTION_ARGS)
i1 = i2 = j = 0;
while (i1 < ncolumns1 || i2 < ncolumns2)
{
+ Form_pg_attribute att1;
+ Form_pg_attribute att2;
TypeCacheEntry *typentry;
Oid collation;
FunctionCallInfoData locfcinfo;
@@ -1119,12 +1129,12 @@ record_eq(PG_FUNCTION_ARGS)
/*
* Skip dropped columns
*/
- if (i1 < ncolumns1 && tupdesc1->attrs[i1]->attisdropped)
+ if (i1 < ncolumns1 && TupleDescAttr(tupdesc1, i1)->attisdropped)
{
i1++;
continue;
}
- if (i2 < ncolumns2 && tupdesc2->attrs[i2]->attisdropped)
+ if (i2 < ncolumns2 && TupleDescAttr(tupdesc2, i2)->attisdropped)
{
i2++;
continue;
@@ -1132,24 +1142,26 @@ record_eq(PG_FUNCTION_ARGS)
if (i1 >= ncolumns1 || i2 >= ncolumns2)
break; /* we'll deal with mismatch below loop */
+ att1 = TupleDescAttr(tupdesc1, i1);
+ att2 = TupleDescAttr(tupdesc2, i2);
+
/*
* Have two matching columns, they must be same type
*/
- if (tupdesc1->attrs[i1]->atttypid !=
- tupdesc2->attrs[i2]->atttypid)
+ if (att1->atttypid != att2->atttypid)
ereport(ERROR,
(errcode(ERRCODE_DATATYPE_MISMATCH),
errmsg("cannot compare dissimilar column types %s and %s at record column %d",
- format_type_be(tupdesc1->attrs[i1]->atttypid),
- format_type_be(tupdesc2->attrs[i2]->atttypid),
+ format_type_be(att1->atttypid),
+ format_type_be(att2->atttypid),
j + 1)));
/*
* If they're not same collation, we don't complain here, but the
* equality function might.
*/
- collation = tupdesc1->attrs[i1]->attcollation;
- if (collation != tupdesc2->attrs[i2]->attcollation)
+ collation = att1->attcollation;
+ if (collation != att2->attcollation)
collation = InvalidOid;
/*
@@ -1157,9 +1169,9 @@ record_eq(PG_FUNCTION_ARGS)
*/
typentry = my_extra->columns[j].typentry;
if (typentry == NULL ||
- typentry->type_id != tupdesc1->attrs[i1]->atttypid)
+ typentry->type_id != att1->atttypid)
{
- typentry = lookup_type_cache(tupdesc1->attrs[i1]->atttypid,
+ typentry = lookup_type_cache(att1->atttypid,
TYPECACHE_EQ_OPR_FINFO);
if (!OidIsValid(typentry->eq_opr_finfo.fn_oid))
ereport(ERROR,
@@ -1370,15 +1382,18 @@ record_image_cmp(FunctionCallInfo fcinfo)
i1 = i2 = j = 0;
while (i1 < ncolumns1 || i2 < ncolumns2)
{
+ Form_pg_attribute att1;
+ Form_pg_attribute att2;
+
/*
* Skip dropped columns
*/
- if (i1 < ncolumns1 && tupdesc1->attrs[i1]->attisdropped)
+ if (i1 < ncolumns1 && TupleDescAttr(tupdesc1, i1)->attisdropped)
{
i1++;
continue;
}
- if (i2 < ncolumns2 && tupdesc2->attrs[i2]->attisdropped)
+ if (i2 < ncolumns2 && TupleDescAttr(tupdesc2, i2)->attisdropped)
{
i2++;
continue;
@@ -1386,24 +1401,25 @@ record_image_cmp(FunctionCallInfo fcinfo)
if (i1 >= ncolumns1 || i2 >= ncolumns2)
break; /* we'll deal with mismatch below loop */
+ att1 = TupleDescAttr(tupdesc1, i1);
+ att2 = TupleDescAttr(tupdesc2, i2);
+
/*
* Have two matching columns, they must be same type
*/
- if (tupdesc1->attrs[i1]->atttypid !=
- tupdesc2->attrs[i2]->atttypid)
+ if (att1->atttypid != att2->atttypid)
ereport(ERROR,
(errcode(ERRCODE_DATATYPE_MISMATCH),
errmsg("cannot compare dissimilar column types %s and %s at record column %d",
- format_type_be(tupdesc1->attrs[i1]->atttypid),
- format_type_be(tupdesc2->attrs[i2]->atttypid),
+ format_type_be(att1->atttypid),
+ format_type_be(att2->atttypid),
j + 1)));
/*
* The same type should have the same length (or both should be
* variable).
*/
- Assert(tupdesc1->attrs[i1]->attlen ==
- tupdesc2->attrs[i2]->attlen);
+ Assert(att1->attlen == att2->attlen);
/*
* We consider two NULLs equal; NULL > not-NULL.
@@ -1426,7 +1442,7 @@ record_image_cmp(FunctionCallInfo fcinfo)
}
/* Compare the pair of elements */
- if (tupdesc1->attrs[i1]->attlen == -1)
+ if (att1->attlen == -1)
{
Size len1,
len2;
@@ -1449,9 +1465,9 @@ record_image_cmp(FunctionCallInfo fcinfo)
if ((Pointer) arg2val != (Pointer) values2[i2])
pfree(arg2val);
}
- else if (tupdesc1->attrs[i1]->attbyval)
+ else if (att1->attbyval)
{
- switch (tupdesc1->attrs[i1]->attlen)
+ switch (att1->attlen)
{
case 1:
if (GET_1_BYTE(values1[i1]) !=
@@ -1495,7 +1511,7 @@ record_image_cmp(FunctionCallInfo fcinfo)
{
cmpresult = memcmp(DatumGetPointer(values1[i1]),
DatumGetPointer(values2[i2]),
- tupdesc1->attrs[i1]->attlen);
+ att1->attlen);
}
if (cmpresult < 0)
@@ -1647,15 +1663,18 @@ record_image_eq(PG_FUNCTION_ARGS)
i1 = i2 = j = 0;
while (i1 < ncolumns1 || i2 < ncolumns2)
{
+ Form_pg_attribute att1;
+ Form_pg_attribute att2;
+
/*
* Skip dropped columns
*/
- if (i1 < ncolumns1 && tupdesc1->attrs[i1]->attisdropped)
+ if (i1 < ncolumns1 && TupleDescAttr(tupdesc1, i1)->attisdropped)
{
i1++;
continue;
}
- if (i2 < ncolumns2 && tupdesc2->attrs[i2]->attisdropped)
+ if (i2 < ncolumns2 && TupleDescAttr(tupdesc2, i2)->attisdropped)
{
i2++;
continue;
@@ -1663,16 +1682,18 @@ record_image_eq(PG_FUNCTION_ARGS)
if (i1 >= ncolumns1 || i2 >= ncolumns2)
break; /* we'll deal with mismatch below loop */
+ att1 = TupleDescAttr(tupdesc1, i1);
+ att2 = TupleDescAttr(tupdesc2, i2);
+
/*
* Have two matching columns, they must be same type
*/
- if (tupdesc1->attrs[i1]->atttypid !=
- tupdesc2->attrs[i2]->atttypid)
+ if (att1->atttypid != att2->atttypid)
ereport(ERROR,
(errcode(ERRCODE_DATATYPE_MISMATCH),
errmsg("cannot compare dissimilar column types %s and %s at record column %d",
- format_type_be(tupdesc1->attrs[i1]->atttypid),
- format_type_be(tupdesc2->attrs[i2]->atttypid),
+ format_type_be(att1->atttypid),
+ format_type_be(att2->atttypid),
j + 1)));
/*
@@ -1687,7 +1708,7 @@ record_image_eq(PG_FUNCTION_ARGS)
}
/* Compare the pair of elements */
- if (tupdesc1->attrs[i1]->attlen == -1)
+ if (att1->attlen == -1)
{
Size len1,
len2;
@@ -1716,9 +1737,9 @@ record_image_eq(PG_FUNCTION_ARGS)
pfree(arg2val);
}
}
- else if (tupdesc1->attrs[i1]->attbyval)
+ else if (att1->attbyval)
{
- switch (tupdesc1->attrs[i1]->attlen)
+ switch (att1->attlen)
{
case 1:
result = (GET_1_BYTE(values1[i1]) ==
@@ -1746,7 +1767,7 @@ record_image_eq(PG_FUNCTION_ARGS)
{
result = (memcmp(DatumGetPointer(values1[i1]),
DatumGetPointer(values2[i2]),
- tupdesc1->attrs[i1]->attlen) == 0);
+ att1->attlen) == 0);
}
if (!result)
break;
diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c
index 7469ec773c6..43646d2c4f8 100644
--- a/src/backend/utils/adt/ruleutils.c
+++ b/src/backend/utils/adt/ruleutils.c
@@ -3698,10 +3698,12 @@ set_relation_column_names(deparse_namespace *dpns, RangeTblEntry *rte,
for (i = 0; i < ncolumns; i++)
{
- if (tupdesc->attrs[i]->attisdropped)
+ Form_pg_attribute attr = TupleDescAttr(tupdesc, i);
+
+ if (attr->attisdropped)
real_colnames[i] = NULL;
else
- real_colnames[i] = pstrdup(NameStr(tupdesc->attrs[i]->attname));
+ real_colnames[i] = pstrdup(NameStr(attr->attname));
}
relation_close(rel, AccessShareLock);
}
@@ -5391,7 +5393,7 @@ get_target_list(List *targetList, deparse_context *context,
* Otherwise, just use what we can find in the TLE.
*/
if (resultDesc && colno <= resultDesc->natts)
- colname = NameStr(resultDesc->attrs[colno - 1]->attname);
+ colname = NameStr(TupleDescAttr(resultDesc, colno - 1)->attname);
else
colname = tle->resname;
@@ -6741,7 +6743,7 @@ get_name_for_var_field(Var *var, int fieldno,
Assert(tupleDesc);
/* Got the tupdesc, so we can extract the field name */
Assert(fieldno >= 1 && fieldno <= tupleDesc->natts);
- return NameStr(tupleDesc->attrs[fieldno - 1]->attname);
+ return NameStr(TupleDescAttr(tupleDesc, fieldno - 1)->attname);
}
/* Find appropriate nesting depth */
@@ -7051,7 +7053,7 @@ get_name_for_var_field(Var *var, int fieldno,
Assert(tupleDesc);
/* Got the tupdesc, so we can extract the field name */
Assert(fieldno >= 1 && fieldno <= tupleDesc->natts);
- return NameStr(tupleDesc->attrs[fieldno - 1]->attname);
+ return NameStr(TupleDescAttr(tupleDesc, fieldno - 1)->attname);
}
/*
@@ -8180,7 +8182,7 @@ get_rule_expr(Node *node, deparse_context *context,
Node *e = (Node *) lfirst(arg);
if (tupdesc == NULL ||
- !tupdesc->attrs[i]->attisdropped)
+ !TupleDescAttr(tupdesc, i)->attisdropped)
{
appendStringInfoString(buf, sep);
/* Whole-row Vars need special treatment here */
@@ -8193,7 +8195,7 @@ get_rule_expr(Node *node, deparse_context *context,
{
while (i < tupdesc->natts)
{
- if (!tupdesc->attrs[i]->attisdropped)
+ if (!TupleDescAttr(tupdesc, i)->attisdropped)
{
appendStringInfoString(buf, sep);
appendStringInfoString(buf, "NULL");
diff --git a/src/backend/utils/adt/tid.c b/src/backend/utils/adt/tid.c
index 8453b65e78a..083f7d60a7b 100644
--- a/src/backend/utils/adt/tid.c
+++ b/src/backend/utils/adt/tid.c
@@ -273,9 +273,11 @@ currtid_for_view(Relation viewrel, ItemPointer tid)
for (i = 0; i < natts; i++)
{
- if (strcmp(NameStr(att->attrs[i]->attname), "ctid") == 0)
+ Form_pg_attribute attr = TupleDescAttr(att, i);
+
+ if (strcmp(NameStr(attr->attname), "ctid") == 0)
{
- if (att->attrs[i]->atttypid != TIDOID)
+ if (attr->atttypid != TIDOID)
elog(ERROR, "ctid isn't of type TID");
tididx = i;
break;
diff --git a/src/backend/utils/adt/xml.c b/src/backend/utils/adt/xml.c
index c47624eff68..24229c2dff7 100644
--- a/src/backend/utils/adt/xml.c
+++ b/src/backend/utils/adt/xml.c
@@ -3099,13 +3099,15 @@ map_sql_table_to_xmlschema(TupleDesc tupdesc, Oid relid, bool nulls,
for (i = 0; i < tupdesc->natts; i++)
{
- if (tupdesc->attrs[i]->attisdropped)
+ Form_pg_attribute att = TupleDescAttr(tupdesc, i);
+
+ if (att->attisdropped)
continue;
appendStringInfo(&result,
" <xsd:element name=\"%s\" type=\"%s\"%s></xsd:element>\n",
- map_sql_identifier_to_xml_name(NameStr(tupdesc->attrs[i]->attname),
+ map_sql_identifier_to_xml_name(NameStr(att->attname),
true, false),
- map_sql_type_to_xml_name(tupdesc->attrs[i]->atttypid, -1),
+ map_sql_type_to_xml_name(att->atttypid, -1),
nulls ? " nillable=\"true\"" : " minOccurs=\"0\"");
}
@@ -3392,10 +3394,11 @@ map_sql_typecoll_to_xmlschema_types(List *tupdesc_list)
for (i = 0; i < tupdesc->natts; i++)
{
- if (tupdesc->attrs[i]->attisdropped)
+ Form_pg_attribute att = TupleDescAttr(tupdesc, i);
+
+ if (att->attisdropped)
continue;
- uniquetypes = list_append_unique_oid(uniquetypes,
- tupdesc->attrs[i]->atttypid);
+ uniquetypes = list_append_unique_oid(uniquetypes, att->atttypid);
}
}
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,
diff --git a/src/backend/utils/fmgr/funcapi.c b/src/backend/utils/fmgr/funcapi.c
index be47d411c5b..9c3f4510ce4 100644
--- a/src/backend/utils/fmgr/funcapi.c
+++ b/src/backend/utils/fmgr/funcapi.c
@@ -419,7 +419,7 @@ resolve_polymorphic_tupdesc(TupleDesc tupdesc, oidvector *declared_args,
/* See if there are any polymorphic outputs; quick out if not */
for (i = 0; i < natts; i++)
{
- switch (tupdesc->attrs[i]->atttypid)
+ switch (TupleDescAttr(tupdesc, i)->atttypid)
{
case ANYELEMENTOID:
have_anyelement_result = true;
@@ -548,13 +548,15 @@ resolve_polymorphic_tupdesc(TupleDesc tupdesc, oidvector *declared_args,
/* And finally replace the tuple column types as needed */
for (i = 0; i < natts; i++)
{
- switch (tupdesc->attrs[i]->atttypid)
+ Form_pg_attribute att = TupleDescAttr(tupdesc, i);
+
+ switch (att->atttypid)
{
case ANYELEMENTOID:
case ANYNONARRAYOID:
case ANYENUMOID:
TupleDescInitEntry(tupdesc, i + 1,
- NameStr(tupdesc->attrs[i]->attname),
+ NameStr(att->attname),
anyelement_type,
-1,
0);
@@ -562,7 +564,7 @@ resolve_polymorphic_tupdesc(TupleDesc tupdesc, oidvector *declared_args,
break;
case ANYARRAYOID:
TupleDescInitEntry(tupdesc, i + 1,
- NameStr(tupdesc->attrs[i]->attname),
+ NameStr(att->attname),
anyarray_type,
-1,
0);
@@ -570,7 +572,7 @@ resolve_polymorphic_tupdesc(TupleDesc tupdesc, oidvector *declared_args,
break;
case ANYRANGEOID:
TupleDescInitEntry(tupdesc, i + 1,
- NameStr(tupdesc->attrs[i]->attname),
+ NameStr(att->attname),
anyrange_type,
-1,
0);
@@ -1344,9 +1346,10 @@ TypeGetTupleDesc(Oid typeoid, List *colaliases)
for (varattno = 0; varattno < natts; varattno++)
{
char *label = strVal(list_nth(colaliases, varattno));
+ Form_pg_attribute attr = TupleDescAttr(tupdesc, varattno);
if (label != NULL)
- namestrcpy(&(tupdesc->attrs[varattno]->attname), label);
+ namestrcpy(&(attr->attname), label);
}
/* The tuple type is now an anonymous record type */
diff --git a/src/backend/utils/misc/pg_config.c b/src/backend/utils/misc/pg_config.c
index 468c7cc9e12..a84878994c7 100644
--- a/src/backend/utils/misc/pg_config.c
+++ b/src/backend/utils/misc/pg_config.c
@@ -54,8 +54,8 @@ pg_config(PG_FUNCTION_ARGS)
* Check to make sure we have a reasonable tuple descriptor
*/
if (tupdesc->natts != 2 ||
- tupdesc->attrs[0]->atttypid != TEXTOID ||
- tupdesc->attrs[1]->atttypid != TEXTOID)
+ TupleDescAttr(tupdesc, 0)->atttypid != TEXTOID ||
+ TupleDescAttr(tupdesc, 1)->atttypid != TEXTOID)
ereport(ERROR,
(errcode(ERRCODE_SYNTAX_ERROR),
errmsg("query-specified return tuple and "