From 922bef2bb73f22b215e07baf2550998cd8d6694b Mon Sep 17 00:00:00 2001
From: Maxim Orlov <orlovmg@gmail.com>
Date: Thu, 24 Aug 2023 16:28:50 +0300
Subject: [PATCH v1 3/4] Make use of vectorized bmss_free function

---
 src/backend/access/heap/heapam.c        | 16 ++++------------
 src/backend/commands/publicationcmds.c  |  3 +--
 src/backend/executor/nodeAppend.c       |  3 +--
 src/backend/optimizer/path/indxpath.c   |  3 +--
 src/backend/optimizer/path/joinpath.c   |  3 +--
 src/backend/statistics/extended_stats.c |  3 +--
 src/backend/utils/cache/relcache.c      | 21 ++++++---------------
 src/include/nodes/bitmapset.h           |  3 +++
 8 files changed, 18 insertions(+), 37 deletions(-)

diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c
index 6a66214a58..dba20614f8 100644
--- a/src/backend/access/heap/heapam.c
+++ b/src/backend/access/heap/heapam.c
@@ -3372,12 +3372,8 @@ l2:
 			ReleaseBuffer(vmbuffer);
 		*update_indexes = TU_None;
 
-		bms_free(hot_attrs);
-		bms_free(sum_attrs);
-		bms_free(key_attrs);
-		bms_free(id_attrs);
-		bms_free(modified_attrs);
-		bms_free(interesting_attrs);
+		bmss_free(hot_attrs, sum_attrs, key_attrs, id_attrs, modified_attrs,
+				  interesting_attrs);
 		return result;
 	}
 
@@ -3887,12 +3883,8 @@ l2:
 	if (old_key_tuple != NULL && old_key_copied)
 		heap_freetuple(old_key_tuple);
 
-	bms_free(hot_attrs);
-	bms_free(sum_attrs);
-	bms_free(key_attrs);
-	bms_free(id_attrs);
-	bms_free(modified_attrs);
-	bms_free(interesting_attrs);
+	bmss_free(hot_attrs, sum_attrs, key_attrs, id_attrs, modified_attrs,
+			  interesting_attrs);
 
 	return TM_Ok;
 }
diff --git a/src/backend/commands/publicationcmds.c b/src/backend/commands/publicationcmds.c
index e4fe6cc72a..3dbbf878b1 100644
--- a/src/backend/commands/publicationcmds.c
+++ b/src/backend/commands/publicationcmds.c
@@ -431,8 +431,7 @@ pub_collist_contains_invalid_column(Oid pubid, Relation relation, List *ancestor
 			}
 		}
 
-		bms_free(idattrs);
-		bms_free(columns);
+		bmss_free(idattrs, columns);
 	}
 
 	ReleaseSysCache(tuple);
diff --git a/src/backend/executor/nodeAppend.c b/src/backend/executor/nodeAppend.c
index 609df6b9e6..4eef4cb53a 100644
--- a/src/backend/executor/nodeAppend.c
+++ b/src/backend/executor/nodeAppend.c
@@ -418,9 +418,8 @@ ExecReScanAppend(AppendState *node)
 					node->as_prune_state->execparamids))
 	{
 		node->as_valid_subplans_identified = false;
-		bms_free(node->as_valid_subplans);
+		bmss_free(node->as_valid_subplans, node->as_valid_asyncplans);
 		node->as_valid_subplans = NULL;
-		bms_free(node->as_valid_asyncplans);
 		node->as_valid_asyncplans = NULL;
 	}
 
diff --git a/src/backend/optimizer/path/indxpath.c b/src/backend/optimizer/path/indxpath.c
index 6a93d767a5..d840fb5e10 100644
--- a/src/backend/optimizer/path/indxpath.c
+++ b/src/backend/optimizer/path/indxpath.c
@@ -1847,8 +1847,7 @@ check_index_only(RelOptInfo *rel, IndexOptInfo *index)
 	/* Do we have all the necessary attributes? */
 	result = bms_is_subset(attrs_used, index_canreturn_attrs);
 
-	bms_free(attrs_used);
-	bms_free(index_canreturn_attrs);
+	bmss_free(attrs_used, index_canreturn_attrs);
 
 	return result;
 }
diff --git a/src/backend/optimizer/path/joinpath.c b/src/backend/optimizer/path/joinpath.c
index f9fd89e734..6b597fc812 100644
--- a/src/backend/optimizer/path/joinpath.c
+++ b/src/backend/optimizer/path/joinpath.c
@@ -412,8 +412,7 @@ have_unsafe_outer_join_ref(PlannerInfo *root,
 	}
 
 	/* Waste no memory when we reject a path here */
-	bms_free(unsatisfied);
-	bms_free(satisfied);
+	bmss_free(unsatisfied, satisfied);
 
 	return result;
 }
diff --git a/src/backend/statistics/extended_stats.c b/src/backend/statistics/extended_stats.c
index 9f67a57724..2af13b9e3e 100644
--- a/src/backend/statistics/extended_stats.c
+++ b/src/backend/statistics/extended_stats.c
@@ -1261,8 +1261,7 @@ choose_best_statistics(List *stats, char requiredkind, bool inh,
 
 		num_matched = bms_num_members(matched_attnums) + bms_num_members(matched_exprs);
 
-		bms_free(matched_attnums);
-		bms_free(matched_exprs);
+		bmss_free(matched_attnums, matched_exprs);
 
 		/*
 		 * save the actual number of keys in the stats so that we can choose
diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c
index 1f813e5946..adef3eee55 100644
--- a/src/backend/utils/cache/relcache.c
+++ b/src/backend/utils/cache/relcache.c
@@ -2440,11 +2440,8 @@ RelationDestroyRelation(Relation relation, bool remember_tupdesc)
 	FreeTriggerDesc(relation->trigdesc);
 	list_free_deep(relation->rd_fkeylist);
 	lists_free(relation->rd_indexlist, relation->rd_statlist);
-	bms_free(relation->rd_keyattr);
-	bms_free(relation->rd_pkattr);
-	bms_free(relation->rd_idattr);
-	bms_free(relation->rd_hotblockingattr);
-	bms_free(relation->rd_summarizedattr);
+	bmss_free(relation->rd_keyattr, relation->rd_pkattr, relation->rd_idattr,
+			  relation->rd_hotblockingattr, relation->rd_summarizedattr);
 	if (relation->rd_pubdesc)
 		pfree(relation->rd_pubdesc);
 	if (relation->rd_options)
@@ -5370,26 +5367,20 @@ restart:
 	{
 		/* Gotta do it over ... might as well not leak memory */
 		lists_free(newindexoidlist, indexoidlist);
-		bms_free(uindexattrs);
-		bms_free(pkindexattrs);
-		bms_free(idindexattrs);
-		bms_free(hotblockingattrs);
-		bms_free(summarizedattrs);
+		bmss_free(uindexattrs, pkindexattrs, idindexattrs, hotblockingattrs,
+				  summarizedattrs);
 
 		goto restart;
 	}
 
 	/* Don't leak the old values of these bitmaps, if any */
 	relation->rd_attrsvalid = false;
-	bms_free(relation->rd_keyattr);
+	bmss_free(relation->rd_keyattr, relation->rd_pkattr, relation->rd_idattr,
+			  relation->rd_hotblockingattr, relation->rd_summarizedattr);
 	relation->rd_keyattr = NULL;
-	bms_free(relation->rd_pkattr);
 	relation->rd_pkattr = NULL;
-	bms_free(relation->rd_idattr);
 	relation->rd_idattr = NULL;
-	bms_free(relation->rd_hotblockingattr);
 	relation->rd_hotblockingattr = NULL;
-	bms_free(relation->rd_summarizedattr);
 	relation->rd_summarizedattr = NULL;
 
 	/*
diff --git a/src/include/nodes/bitmapset.h b/src/include/nodes/bitmapset.h
index 14de6a9ff1..0c1bdbb4c1 100644
--- a/src/include/nodes/bitmapset.h
+++ b/src/include/nodes/bitmapset.h
@@ -84,6 +84,9 @@ extern int	bms_compare(const Bitmapset *a, const Bitmapset *b);
 extern Bitmapset *bms_make_singleton(int x);
 extern void bms_free(Bitmapset *a);
 
+#define bmss_free(...) \
+	func_vectorizor(bms_free, __VA_ARGS__)
+
 extern Bitmapset *bms_union(const Bitmapset *a, const Bitmapset *b);
 extern Bitmapset *bms_intersect(const Bitmapset *a, const Bitmapset *b);
 extern Bitmapset *bms_difference(const Bitmapset *a, const Bitmapset *b);
-- 
2.41.0

