diff --git a/src/backend/partitioning/partdesc.c b/src/backend/partitioning/partdesc.c
index a4494aca7a..0593f044c2 100644
--- a/src/backend/partitioning/partdesc.c
+++ b/src/backend/partitioning/partdesc.c
@@ -68,6 +68,17 @@ RelationBuildPartitionDesc(Relation rel)
 	PartitionKey key = RelationGetPartitionKey(rel);
 	MemoryContext oldcxt;
 	int		   *mapping;
+	MemoryContext rbcontext = NULL;
+
+	/*
+	 * While building the partition descriptor, we create various temporary
+	 * data structures; in CLOBBER_CACHE_ALWAYS mode, at least, it's important
+	 * not to leak them, since this can get called a lot.
+	 */
+	rbcontext = AllocSetContextCreate(CurrentMemoryContext,
+									  "RelationBuildPartitionDesc",
+									  ALLOCSET_DEFAULT_SIZES);
+	oldcxt = MemoryContextSwitchTo(rbcontext);
 
 	/*
 	 * Get partition oids from pg_inherits.  This uses a single snapshot to
@@ -180,7 +191,7 @@ RelationBuildPartitionDesc(Relation rel)
 	MemoryContextCopyAndSetIdentifier(rel->rd_pdcxt,
 									  RelationGetRelationName(rel));
 
-	oldcxt = MemoryContextSwitchTo(rel->rd_pdcxt);
+	MemoryContextSwitchTo(rel->rd_pdcxt);
 	partdesc = (PartitionDescData *) palloc0(sizeof(PartitionDescData));
 	partdesc->nparts = nparts;
 	/* oids and boundinfo are allocated below. */
@@ -189,7 +200,11 @@ RelationBuildPartitionDesc(Relation rel)
 
 	if (nparts == 0)
 	{
+		/* We can exit early in this case. */
 		rel->rd_partdesc = partdesc;
+
+		/* Blow away the temporary context. */
+		MemoryContextDelete(rbcontext);
 		return;
 	}
 
@@ -220,6 +235,9 @@ RelationBuildPartitionDesc(Relation rel)
 	MemoryContextSwitchTo(oldcxt);
 
 	rel->rd_partdesc = partdesc;
+
+	/* Blow away the temporary context. */
+	MemoryContextDelete(rbcontext);
 }
 
 /*
