v1-0001-Replace-name-buffers-from-RemoteAttributeMapping-efujita.patch

application/octet-stream

Filename: v1-0001-Replace-name-buffers-from-RemoteAttributeMapping-efujita.patch
Type: application/octet-stream
Part: 0
Message: Re: Import Statistics in postgres_fdw before resorting to sampling.
diff --git a/contrib/postgres_fdw/postgres_fdw.c b/contrib/postgres_fdw/postgres_fdw.c
index cdb555727f8..30eb6668b6c 100644
--- a/contrib/postgres_fdw/postgres_fdw.c
+++ b/contrib/postgres_fdw/postgres_fdw.c
@@ -333,8 +333,8 @@ typedef struct
 typedef struct
 {
 	AttrNumber	local_attnum;
-	char		local_attname[NAMEDATALEN];
-	char		remote_attname[NAMEDATALEN];
+	char	   *local_attname;
+	char	   *remote_attname;
 	int			res_index;
 } RemoteAttributeMapping;
 
@@ -704,6 +704,7 @@ static PGresult *fetch_attstats(PGconn *conn, int server_version_num,
 								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,
@@ -5670,8 +5671,7 @@ postgresImportForeignStatistics(Relation relation, List *va_cols, int elevel)
 
 	PQclear(remstats.rel);
 	PQclear(remstats.att);
-	if (remattrmap)
-		pfree(remattrmap);
+	free_remattrmap(remattrmap, attrcnt);
 
 	return ok;
 }
@@ -5957,8 +5957,8 @@ build_remattrmap(Relation relation, List *va_cols,
 		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++;
 	}
@@ -5972,6 +5972,26 @@ build_remattrmap(Relation relation, List *va_cols,
 	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.
  *