diff options
author | Andres Freund <andres@anarazel.de> | 2017-08-20 11:19:07 -0700 |
---|---|---|
committer | Andres Freund <andres@anarazel.de> | 2017-08-20 11:19:07 -0700 |
commit | 2cd70845240087da205695baedab6412342d1dbe (patch) | |
tree | 20a3b6a2231dae248218ac54983c7a854328265f /src/backend/utils/adt | |
parent | b1c2d76a2fcef812af0be3343082414d401909c8 (diff) | |
download | postgresql-2cd70845240087da205695baedab6412342d1dbe.tar.gz postgresql-2cd70845240087da205695baedab6412342d1dbe.zip |
Change tupledesc->attrs[n] to TupleDescAttr(tupledesc, n).
This is a mechanical change in preparation for a later commit that
will change the layout of TupleDesc. Introducing a macro to abstract
the details of where attributes are stored will allow us to change
that in separate step and revise it in future.
Author: Thomas Munro, editorialized by Andres Freund
Reviewed-By: Andres Freund
Discussion: https://postgr.es/m/CAEepm=0ZtQ-SpsgCyzzYpsXS6e=kZWqk3g5Ygn3MDV7A8dabUA@mail.gmail.com
Diffstat (limited to 'src/backend/utils/adt')
-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 |
8 files changed, 110 insertions, 80 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); } } |