typedef struct
{
AttrNumber local_attnum;
- char local_attname[NAMEDATALEN];
- char remote_attname[NAMEDATALEN];
+ char *local_attname;
+ char *remote_attname;
int res_index;
} RemoteAttributeMapping;
const char *column_list);
static RemoteAttributeMapping *build_remattrmap(Relation relation, List *va_cols,
int *p_attrcnt, StringInfo column_list);
+static void free_remattrmap(RemoteAttributeMapping *map, int len);
static bool attname_in_list(const char *attname, List *va_cols);
static int remattrmap_cmp(const void *v1, const void *v2);
static bool match_attrmap(PGresult *res,
PQclear(remstats.rel);
PQclear(remstats.att);
- if (remattrmap)
- pfree(remattrmap);
+ free_remattrmap(remattrmap, attrcnt);
return ok;
}
deparseStringLiteral(column_list, remote_attname);
remattrmap[attrcnt].local_attnum = attnum;
- strncpy(remattrmap[attrcnt].local_attname, attname, NAMEDATALEN);
- strncpy(remattrmap[attrcnt].remote_attname, remote_attname, NAMEDATALEN);
+ remattrmap[attrcnt].local_attname = pstrdup(attname);
+ remattrmap[attrcnt].remote_attname = pstrdup(remote_attname);
remattrmap[attrcnt].res_index = -1;
attrcnt++;
}
return remattrmap;
}
+/*
+ * Free the structure created by build_remattrmap().
+ */
+static void
+free_remattrmap(RemoteAttributeMapping *map, int len)
+{
+ if (!map)
+ return;
+
+ for (int i = 0; i < len; i++)
+ {
+ Assert(map[i].local_attname);
+ pfree(map[i].local_attname);
+ Assert(map[i].remote_attname);
+ pfree(map[i].remote_attname);
+ }
+
+ pfree(map);
+}
+
/*
* Test if an attribute name is in the list.
*