diff options
Diffstat (limited to 'src/backend/utils')
-rw-r--r-- | src/backend/utils/adt/json.c | 8 | ||||
-rw-r--r-- | src/backend/utils/adt/jsonb.c | 8 | ||||
-rw-r--r-- | src/backend/utils/adt/jsonfuncs.c | 2 | ||||
-rw-r--r-- | src/backend/utils/adt/orderedsetaggs.c | 6 | ||||
-rw-r--r-- | src/backend/utils/adt/rowtypes.c | 129 | ||||
-rw-r--r-- | src/backend/utils/adt/ruleutils.c | 16 | ||||
-rw-r--r-- | src/backend/utils/adt/tid.c | 6 | ||||
-rw-r--r-- | src/backend/utils/adt/xml.c | 15 | ||||
-rw-r--r-- | src/backend/utils/cache/catcache.c | 5 | ||||
-rw-r--r-- | src/backend/utils/cache/relcache.c | 55 | ||||
-rw-r--r-- | src/backend/utils/cache/typcache.c | 7 | ||||
-rw-r--r-- | src/backend/utils/fmgr/funcapi.c | 15 | ||||
-rw-r--r-- | src/backend/utils/misc/pg_config.c | 4 |
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 " |