From fe5cd43c2f8ed5b08aa8bcf8da6e8a5a23c89307 Mon Sep 17 00:00:00 2001
From: Maxim Orlov <orlovmg@gmail.com>
Date: Thu, 24 Aug 2023 16:13:20 +0300
Subject: [PATCH v1 2/4] Make use of vectorized lists_free and lists_free_deep
 functions

---
 src/backend/catalog/namespace.c             |  3 +--
 src/backend/catalog/pg_inherits.c           |  3 +--
 src/backend/catalog/pg_publication.c        |  3 +--
 src/backend/commands/publicationcmds.c      |  3 +--
 src/backend/executor/nodeModifyTable.c      |  4 ++--
 src/backend/optimizer/path/costsize.c       |  3 +--
 src/backend/optimizer/path/joinpath.c       | 12 ++++--------
 src/backend/optimizer/plan/planner.c        | 12 ++++--------
 src/backend/optimizer/util/predtest.c       |  3 +--
 src/backend/partitioning/partbounds.c       |  7 ++-----
 src/backend/partitioning/partprune.c        |  3 +--
 src/backend/replication/pgoutput/pgoutput.c |  4 +---
 src/backend/utils/cache/relcache.c          |  9 +++------
 src/backend/utils/misc/guc.c                |  3 +--
 14 files changed, 24 insertions(+), 48 deletions(-)

diff --git a/src/backend/catalog/namespace.c b/src/backend/catalog/namespace.c
index 4ceae038ec..4c2dfb1cd1 100644
--- a/src/backend/catalog/namespace.c
+++ b/src/backend/catalog/namespace.c
@@ -3794,8 +3794,7 @@ recomputeNamespacePath(void)
 
 	/* Clean up. */
 	pfree(rawname);
-	list_free(namelist);
-	list_free(oidlist);
+	lists_free(namelist, oidlist);
 }
 
 /*
diff --git a/src/backend/catalog/pg_inherits.c b/src/backend/catalog/pg_inherits.c
index da969bd2f9..c0929e69d8 100644
--- a/src/backend/catalog/pg_inherits.c
+++ b/src/backend/catalog/pg_inherits.c
@@ -496,8 +496,7 @@ typeInheritsFrom(Oid subclassTypeId, Oid superclassTypeId)
 	/* clean up ... */
 	table_close(inhrel, AccessShareLock);
 
-	list_free(visited);
-	list_free(queue);
+	lists_free(visited, queue);
 
 	return result;
 }
diff --git a/src/backend/catalog/pg_publication.c b/src/backend/catalog/pg_publication.c
index c488b6370b..81075a86b3 100644
--- a/src/backend/catalog/pg_publication.c
+++ b/src/backend/catalog/pg_publication.c
@@ -349,8 +349,7 @@ GetTopMostAncestorInPublication(Oid puboid, List *ancestors, int *ancestor_level
 			}
 		}
 
-		list_free(apubids);
-		list_free(aschemaPubids);
+		lists_free(apubids, aschemaPubids);
 	}
 
 	return topmost_relid;
diff --git a/src/backend/commands/publicationcmds.c b/src/backend/commands/publicationcmds.c
index f4ba572697..e4fe6cc72a 100644
--- a/src/backend/commands/publicationcmds.c
+++ b/src/backend/commands/publicationcmds.c
@@ -1693,8 +1693,7 @@ OpenTableList(List *tables)
 		}
 	}
 
-	list_free(relids);
-	list_free(relids_with_rf);
+	lists_free(relids, relids_with_rf);
 
 	return rels;
 }
diff --git a/src/backend/executor/nodeModifyTable.c b/src/backend/executor/nodeModifyTable.c
index 5005d8c0d1..ebfcfc9ce2 100644
--- a/src/backend/executor/nodeModifyTable.c
+++ b/src/backend/executor/nodeModifyTable.c
@@ -1293,8 +1293,8 @@ ExecPendingInserts(EState *estate)
 						estate, mtstate->canSetTag);
 	}
 
-	list_free(estate->es_insert_pending_result_relations);
-	list_free(estate->es_insert_pending_modifytables);
+	lists_free(estate->es_insert_pending_result_relations,
+			   estate->es_insert_pending_modifytables);
 	estate->es_insert_pending_result_relations = NIL;
 	estate->es_insert_pending_modifytables = NIL;
 }
diff --git a/src/backend/optimizer/path/costsize.c b/src/backend/optimizer/path/costsize.c
index d6ceafd51c..c5de63bc4c 100644
--- a/src/backend/optimizer/path/costsize.c
+++ b/src/backend/optimizer/path/costsize.c
@@ -5461,8 +5461,7 @@ calc_joinrel_size_estimate(PlannerInfo *root,
 										sjinfo);
 
 		/* Avoid leaking a lot of ListCells */
-		list_free(joinquals);
-		list_free(pushedquals);
+		lists_free(joinquals, pushedquals);
 	}
 	else
 	{
diff --git a/src/backend/optimizer/path/joinpath.c b/src/backend/optimizer/path/joinpath.c
index 821d282497..f9fd89e734 100644
--- a/src/backend/optimizer/path/joinpath.c
+++ b/src/backend/optimizer/path/joinpath.c
@@ -465,8 +465,7 @@ paraminfo_get_equal_hashops(PlannerInfo *root, ParamPathInfo *param_info,
 			if (!IsA(opexpr, OpExpr) || list_length(opexpr->args) != 2 ||
 				!clause_sides_match_join(rinfo, outerrel, innerrel))
 			{
-				list_free(*operators);
-				list_free(*param_exprs);
+				lists_free(*operators, *param_exprs);
 				return false;
 			}
 
@@ -484,8 +483,7 @@ paraminfo_get_equal_hashops(PlannerInfo *root, ParamPathInfo *param_info,
 			/* can't do memoize if we can't hash the outer type */
 			if (!OidIsValid(hasheqoperator))
 			{
-				list_free(*operators);
-				list_free(*param_exprs);
+				lists_free(*operators, *param_exprs);
 				return false;
 			}
 
@@ -517,8 +515,7 @@ paraminfo_get_equal_hashops(PlannerInfo *root, ParamPathInfo *param_info,
 		/* Reject if there are any volatile functions in lateral vars */
 		if (contain_volatile_functions(expr))
 		{
-			list_free(*operators);
-			list_free(*param_exprs);
+			lists_free(*operators, *param_exprs);
 			return false;
 		}
 
@@ -528,8 +525,7 @@ paraminfo_get_equal_hashops(PlannerInfo *root, ParamPathInfo *param_info,
 		/* can't use memoize without a valid hash proc and equals operator */
 		if (!OidIsValid(typentry->hash_proc) || !OidIsValid(typentry->eq_opr))
 		{
-			list_free(*operators);
-			list_free(*param_exprs);
+			lists_free(*operators, *param_exprs);
 			return false;
 		}
 
diff --git a/src/backend/optimizer/plan/planner.c b/src/backend/optimizer/plan/planner.c
index 44efb1f4eb..165fd9241b 100644
--- a/src/backend/optimizer/plan/planner.c
+++ b/src/backend/optimizer/plan/planner.c
@@ -5413,8 +5413,7 @@ make_group_input_target(PlannerInfo *root, PathTarget *final_target)
 	add_new_columns_to_pathtarget(input_target, non_group_vars);
 
 	/* clean up cruft */
-	list_free(non_group_vars);
-	list_free(non_group_cols);
+	lists_free(non_group_vars, non_group_cols);
 
 	/* XXX this causes some redundant cost calculation ... */
 	return set_pathtarget_cost_width(root, input_target);
@@ -5526,8 +5525,7 @@ make_partial_grouping_target(PlannerInfo *root,
 	}
 
 	/* clean up cruft */
-	list_free(non_group_exprs);
-	list_free(non_group_cols);
+	lists_free(non_group_exprs, non_group_cols);
 
 	/* XXX this causes some redundant cost calculation ... */
 	return set_pathtarget_cost_width(root, partial_target);
@@ -6009,8 +6007,7 @@ make_window_input_target(PlannerInfo *root,
 	add_new_columns_to_pathtarget(input_target, flattenable_vars);
 
 	/* clean up cruft */
-	list_free(flattenable_vars);
-	list_free(flattenable_cols);
+	lists_free(flattenable_vars, flattenable_cols);
 
 	/* XXX this causes some redundant cost calculation ... */
 	return set_pathtarget_cost_width(root, input_target);
@@ -6309,8 +6306,7 @@ make_sort_input_target(PlannerInfo *root,
 	add_new_columns_to_pathtarget(input_target, postponable_vars);
 
 	/* clean up cruft */
-	list_free(postponable_vars);
-	list_free(postponable_cols);
+	lists_free(postponable_vars, postponable_cols);
 
 	/* XXX this represents even more redundant cost calculation ... */
 	return set_pathtarget_cost_width(root, input_target);
diff --git a/src/backend/optimizer/util/predtest.c b/src/backend/optimizer/util/predtest.c
index 237c883874..1ca1f45e2e 100644
--- a/src/backend/optimizer/util/predtest.c
+++ b/src/backend/optimizer/util/predtest.c
@@ -2166,8 +2166,7 @@ lookup_proof_cache(Oid pred_op, Oid clause_op, bool refute_it)
 			break;
 	}
 
-	list_free_deep(pred_op_infos);
-	list_free_deep(clause_op_infos);
+	lists_free_deep(pred_op_infos, clause_op_infos);
 
 	if (!found)
 	{
diff --git a/src/backend/partitioning/partbounds.c b/src/backend/partitioning/partbounds.c
index 5436cc302d..66b8479075 100644
--- a/src/backend/partitioning/partbounds.c
+++ b/src/backend/partitioning/partbounds.c
@@ -1477,8 +1477,7 @@ merge_list_bounds(FmgrInfo *partsupfunc, Oid *partcollation,
 
 cleanup:
 	/* Free local memory before returning. */
-	list_free(merged_datums);
-	list_free(merged_indexes);
+	lists_free(merged_datums, merged_indexes);
 	free_partition_map(&outer_map);
 	free_partition_map(&inner_map);
 
@@ -1795,9 +1794,7 @@ merge_range_bounds(int partnatts, FmgrInfo *partsupfuncs,
 
 cleanup:
 	/* Free local memory before returning. */
-	list_free(merged_datums);
-	list_free(merged_kinds);
-	list_free(merged_indexes);
+	lists_free(merged_datums, merged_kinds, merged_indexes);
 	free_partition_map(&outer_map);
 	free_partition_map(&inner_map);
 
diff --git a/src/backend/partitioning/partprune.c b/src/backend/partitioning/partprune.c
index 7179b22a05..9a95986ad6 100644
--- a/src/backend/partitioning/partprune.c
+++ b/src/backend/partitioning/partprune.c
@@ -2501,8 +2501,7 @@ get_steps_using_prefix_recurse(GeneratePruningStepsContext *context,
 													   step_cmpfns1);
 			result = list_concat(result, moresteps);
 
-			list_free(step_exprs1);
-			list_free(step_cmpfns1);
+			lists_free(step_exprs1, step_cmpfns1);
 		}
 	}
 	else
diff --git a/src/backend/replication/pgoutput/pgoutput.c b/src/backend/replication/pgoutput/pgoutput.c
index b08ca55041..1596cd163b 100644
--- a/src/backend/replication/pgoutput/pgoutput.c
+++ b/src/backend/replication/pgoutput/pgoutput.c
@@ -2198,9 +2198,7 @@ get_rel_sync_entry(PGOutputData *data, Relation relation)
 			pgoutput_column_list_init(data, rel_publications, entry);
 		}
 
-		list_free(pubids);
-		list_free(schemaPubids);
-		list_free(rel_publications);
+		lists_free(pubids, schemaPubids, rel_publications);
 
 		entry->replicate_valid = true;
 	}
diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c
index 8e08ca1c68..1f813e5946 100644
--- a/src/backend/utils/cache/relcache.c
+++ b/src/backend/utils/cache/relcache.c
@@ -2439,8 +2439,7 @@ RelationDestroyRelation(Relation relation, bool remember_tupdesc)
 	}
 	FreeTriggerDesc(relation->trigdesc);
 	list_free_deep(relation->rd_fkeylist);
-	list_free(relation->rd_indexlist);
-	list_free(relation->rd_statlist);
+	lists_free(relation->rd_indexlist, relation->rd_statlist);
 	bms_free(relation->rd_keyattr);
 	bms_free(relation->rd_pkattr);
 	bms_free(relation->rd_idattr);
@@ -5365,14 +5364,12 @@ restart:
 		relreplindex == relation->rd_replidindex)
 	{
 		/* Still the same index set, so proceed */
-		list_free(newindexoidlist);
-		list_free(indexoidlist);
+		lists_free(newindexoidlist, indexoidlist);
 	}
 	else
 	{
 		/* Gotta do it over ... might as well not leak memory */
-		list_free(newindexoidlist);
-		list_free(indexoidlist);
+		lists_free(newindexoidlist, indexoidlist);
 		bms_free(uindexattrs);
 		bms_free(pkindexattrs);
 		bms_free(idindexattrs);
diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c
index 84e7ad4d90..c474fe74c0 100644
--- a/src/backend/utils/misc/guc.c
+++ b/src/backend/utils/misc/guc.c
@@ -6299,8 +6299,7 @@ ProcessGUCArray(ArrayType *array,
 		pfree(value);
 	}
 
-	list_free(gucNames);
-	list_free(gucValues);
+	lists_free(gucNames, gucValues);
 }
 
 
-- 
2.41.0

