96 nincols = noutcols = 0;
98 for (
i = 0;
i < n;
i++)
104 if (att->attisdropped)
107 atttypid = att->atttypid;
108 atttypmod = att->atttypmod;
112 if (att->attisdropped)
117 if (atttypid != att->atttypid ||
118 (atttypmod != att->atttypmod && atttypmod >= 0))
120 (
errcode(ERRCODE_DATATYPE_MISMATCH),
122 errdetail(
"Returned type %s does not match expected type %s in column %d.",
148 (
errcode(ERRCODE_DATATYPE_MISMATCH),
150 errdetail(
"Number of returned columns (%d) does not match "
151 "expected column count (%d).",
152 nincols, noutcols)));
188 outnatts = outdesc->
natts;
189 innatts = indesc->
natts;
192 for (
i = 0;
i < outnatts;
i++)
200 if (outatt->attisdropped)
203 atttypid = outatt->atttypid;
204 atttypmod = outatt->atttypmod;
217 for (
j = 0;
j < innatts;
j++)
222 if (nextindesc >= innatts)
226 if (inatt->attisdropped)
231 if (atttypid != inatt->atttypid || atttypmod != inatt->atttypmod)
233 (
errcode(ERRCODE_DATATYPE_MISMATCH),
234 errmsg(
"could not convert row type"),
235 errdetail(
"Attribute \"%s\" of type %s does not match corresponding attribute of type %s.",
239 attrMap->
attnums[
i] = inatt->attnum;
243 if (attrMap->
attnums[
i] == 0 && !missing_ok)
245 (
errcode(ERRCODE_DATATYPE_MISMATCH),
246 errmsg(
"could not convert row type"),
247 errdetail(
"Attribute \"%s\" of type %s does not exist in type %s.",
309 if (inatt->atthasmissing)
321 inatt->attisdropped &&
322 inatt->attlen == outatt->attlen &&
323 inatt->attalign == outatt->attalign)
void free_attrmap(AttrMap *map)
AttrMap * make_attrmap(int maplen)
AttrMap * build_attrmap_by_position(TupleDesc indesc, TupleDesc outdesc, const char *msg)
AttrMap * build_attrmap_by_name_if_req(TupleDesc indesc, TupleDesc outdesc, bool missing_ok)
static bool check_attrmap_match(TupleDesc indesc, TupleDesc outdesc, AttrMap *attrMap)
AttrMap * build_attrmap_by_name(TupleDesc indesc, TupleDesc outdesc, bool missing_ok)
static void PGresult * res
int errmsg_internal(const char *fmt,...)
int errdetail(const char *fmt,...)
int errcode(int sqlerrcode)
int errmsg(const char *fmt,...)
#define ereport(elevel,...)
void pfree(void *pointer)
void * palloc0(Size size)
FormData_pg_attribute * Form_pg_attribute
#define TupleDescAttr(tupdesc, i)