From 3b9e8039c15c87f6dc83369419c85c4a0a3b5688 Mon Sep 17 00:00:00 2001 From: Ashutosh Bapat Date: Thu, 31 Aug 2023 19:02:23 +0530 Subject: [PATCH 2/4] Free intermediate Relids created in adjust_child_relids_multilevel() adjust_child_relids_multilevel() creates Relids for all the intermediate stages in a partition hierarchy. These relid sets are not required finally. Relids or Bitmapset take reasonably large space when thousands of partitions are invovled. Hence free these intermediate relid sets. Ashutosh Bapat --- src/backend/optimizer/util/appendinfo.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/backend/optimizer/util/appendinfo.c b/src/backend/optimizer/util/appendinfo.c index f456b3b0a4..4008e52de2 100644 --- a/src/backend/optimizer/util/appendinfo.c +++ b/src/backend/optimizer/util/appendinfo.c @@ -591,6 +591,8 @@ adjust_child_relids_multilevel(PlannerInfo *root, Relids relids, { AppendRelInfo **appinfos; int nappinfos; + Relids tmp_relids = NULL; + Relids child_relids; /* * If the given relids set doesn't contain any of the parent relids, it @@ -599,13 +601,14 @@ adjust_child_relids_multilevel(PlannerInfo *root, Relids relids, if (!bms_overlap(relids, parentrel->relids)) return relids; + tmp_relids = relids; /* Recurse if immediate parent is not the top parent. */ if (childrel->parent != parentrel) { if (childrel->parent) - relids = adjust_child_relids_multilevel(root, relids, - childrel->parent, - parentrel); + tmp_relids = adjust_child_relids_multilevel(root, relids, + childrel->parent, + parentrel); else elog(ERROR, "childrel is not a child of parentrel"); } @@ -613,11 +616,15 @@ adjust_child_relids_multilevel(PlannerInfo *root, Relids relids, /* Now translate for this child. */ appinfos = find_appinfos_by_relids(root, childrel->relids, &nappinfos); - relids = adjust_child_relids(relids, nappinfos, appinfos); + child_relids = adjust_child_relids(tmp_relids, nappinfos, appinfos); + + /* Free any intermediate Relids created. */ + if (tmp_relids != relids) + bms_free(tmp_relids); pfree(appinfos); - return relids; + return child_relids; } /* -- 2.25.1