diff --git a/src/backend/catalog/partition.c b/src/backend/catalog/partition.c
index 20e8de9..5a44947 100644
--- a/src/backend/catalog/partition.c
+++ b/src/backend/catalog/partition.c
@@ -296,11 +296,12 @@ static Bitmapset *get_partitions_excluded_by_ne_clauses(
 static Bitmapset *get_partitions_from_or_clause_args(
 								   PartitionPruneContext *context,
 								   List *or_clause_args);
-static void extract_partition_key_clauses(PartitionKey partkey, List *clauses,
-							  int rt_index, PartitionClauseInfo *partclauses);
+static PartitionClauseInfo *extract_partition_key_clauses(
+							  PartitionKey partkey, List *clauses,
+							  int rt_index);
 static bool extract_bounding_datums(PartitionKey partkey,
 						PartitionPruneContext *context,
-						PartScanKeyInfo *keys);
+						List **minimalclauses, PartScanKeyInfo *keys);
 static bool partition_cmp_args(PartitionKey key, int partkeyidx,
 				   PartClause *pc, PartClause *leftarg, PartClause *rightarg,
 				   bool *result);
@@ -309,7 +310,8 @@ static PartOpStrategy partition_op_strategy(PartitionKey key, PartClause *pc,
 static bool partkey_datum_from_expr(PartitionKey key, int partkeyidx,
 						Expr *expr, Datum *value);
 static void remove_redundant_clauses(PartitionKey partkey,
-						 PartitionPruneContext *context);
+						 PartitionPruneContext *context,
+						 List **minimalclauses);
 static Bitmapset *get_partitions_for_keys(Relation rel,
 						PartScanKeyInfo *keys);
 static Bitmapset *get_partitions_for_keys_hash(Relation rel,
@@ -1690,7 +1692,7 @@ get_partition_qual_relid(Oid relid)
 }
 
 /*
- * populate_partition_clauses
+ * generate_partition_clauses
  *		Processes 'clauses' to try to match them to relation's partition
  *		keys.  If any compatible clauses are found which match a partition
  *		key, then these clauses are stored in 'partclauseinfo'.
@@ -1700,10 +1702,9 @@ get_partition_qual_relid(Oid relid)
  * so, then they must be aware that the 'partclauseinfo' may only be partially
  * populated.
  */
-void
-populate_partition_clauses(Relation relation,
-						   int rt_index, List *clauses,
-						   PartitionClauseInfo *partclauseinfo)
+PartitionClauseInfo *
+generate_partition_clauses(Relation relation,
+						   int rt_index, List *clauses)
 {
 	PartitionDesc		partdesc;
 	PartitionKey		partkey;
@@ -1744,7 +1745,7 @@ populate_partition_clauses(Relation relation,
 		clauses = list_concat(clauses, partqual);
 	}
 
-	extract_partition_key_clauses(partkey, clauses, rt_index, partclauseinfo);
+	return extract_partition_key_clauses(partkey, clauses, rt_index);
 }
 
 /*
@@ -1784,15 +1785,19 @@ get_partitions_from_clauses(PartitionPruneContext *context)
 	else
 	{
 		PartitionKey	partkey = RelationGetPartitionKey(context->relation);
+		List *minimalclauses[PARTITION_MAX_KEYS];
 
-		/* collapse clauses down to the most restrictive set */
-		remove_redundant_clauses(partkey, context);
+		/*
+		 * Populate minimal clauses with the most restrictive
+		 * of clauses from context's partclauseinfo.
+		 */
+		remove_redundant_clauses(partkey, context, minimalclauses);
 
 		/* Did remove_redundant_clauses find any contradicting clauses? */
 		if (partclauseinfo->constfalse)
 			return NULL;
 
-		if (extract_bounding_datums(partkey, context, &keys))
+		if (extract_bounding_datums(partkey, context, minimalclauses, &keys))
 		{
 			result = get_partitions_for_keys(context->relation, &keys);
 
@@ -1995,14 +2000,14 @@ get_partitions_from_or_clause_args(PartitionPruneContext *context,
 	foreach(lc, or_clause_args)
 	{
 		List *clauses = list_make1(lfirst(lc));
-		PartitionClauseInfo partclauseinfo;
+		PartitionClauseInfo *partclauseinfo;
 		PartitionPruneContext subcontext;
 		Bitmapset *arg_partset;
 
-		extract_partition_key_clauses(partkey, clauses, context->rt_index,
-									  &partclauseinfo);
+		partclauseinfo = extract_partition_key_clauses(partkey, clauses,
+													   context->rt_index);
 
-		if (!partclauseinfo.foundkeyclauses)
+		if (!partclauseinfo->foundkeyclauses)
 		{
 			List *partconstr = RelationGetPartitionQual(context->relation);
 			PartitionDesc partdesc;
@@ -2024,7 +2029,7 @@ get_partitions_from_or_clause_args(PartitionPruneContext *context,
 
 		subcontext.rt_index = context->rt_index;
 		subcontext.relation = context->relation;
-		subcontext.clauseinfo = &partclauseinfo;
+		subcontext.clauseinfo = partclauseinfo;
 		arg_partset = get_partitions_from_clauses(&subcontext);
 
 		result = bms_add_members(result, arg_partset);
@@ -2058,15 +2063,21 @@ get_partitions_from_or_clause_args(PartitionPruneContext *context,
  * processing any further clauses.  In this case, the caller must be careful
  * not to assume the PartitionClauseInfo is fully populated with all clauses.
  */
-static void
+static PartitionClauseInfo *
 extract_partition_key_clauses(PartitionKey partkey, List *clauses,
-							  int rt_index,
-							  PartitionClauseInfo *partclauseinfo)
+							  int rt_index)
 {
+	PartitionClauseInfo *partclauseinfo = makeNode(PartitionClauseInfo);
 	int			i;
 	ListCell   *lc;
 
-	memset(partclauseinfo, 0, sizeof(PartitionClauseInfo));
+	memset(partclauseinfo->keyclauses, 0, sizeof(partclauseinfo->keyclauses));
+	partclauseinfo->or_clauses = NIL;
+	partclauseinfo->ne_clauses = NIL;
+	partclauseinfo->keyisnull = NULL;
+	partclauseinfo->keyisnotnull = NULL;
+	partclauseinfo->constfalse = false;
+	partclauseinfo->foundkeyclauses = false;
 
 	foreach(lc, clauses)
 	{
@@ -2082,7 +2093,7 @@ extract_partition_key_clauses(PartitionKey partkey, List *clauses,
 				!DatumGetBool(((Const *) clause)->constvalue))
 			{
 				partclauseinfo->constfalse = true;
-				return;
+				return partclauseinfo;
 			}
 		}
 
@@ -2261,7 +2272,7 @@ extract_partition_key_clauses(PartitionKey partkey, List *clauses,
 				if (bms_is_member(i, partclauseinfo->keyisnull))
 				{
 					partclauseinfo->constfalse = true;
-					return;
+					return partclauseinfo;
 				}
 				/* Record that a strict clause has been seen for this key */
 				partclauseinfo->keyisnotnull =
@@ -2427,7 +2438,7 @@ extract_partition_key_clauses(PartitionKey partkey, List *clauses,
 						if (bms_is_member(i, partclauseinfo->keyisnotnull))
 						{
 							partclauseinfo->constfalse = true;
-							return;
+							return partclauseinfo;
 						}
 						partclauseinfo->keyisnull =
 									bms_add_member(partclauseinfo->keyisnull,
@@ -2439,7 +2450,7 @@ extract_partition_key_clauses(PartitionKey partkey, List *clauses,
 						if (bms_is_member(i, partclauseinfo->keyisnull))
 						{
 							partclauseinfo->constfalse = true;
-							return;
+							return partclauseinfo;
 						}
 
 						partclauseinfo->keyisnotnull =
@@ -2513,6 +2524,8 @@ extract_partition_key_clauses(PartitionKey partkey, List *clauses,
 			}
 		}
 	}
+
+	return partclauseinfo;
 }
 
 /*
@@ -2530,7 +2543,7 @@ extract_partition_key_clauses(PartitionKey partkey, List *clauses,
  */
 static bool
 extract_bounding_datums(PartitionKey partkey, PartitionPruneContext *context,
-						PartScanKeyInfo *keys)
+						List **minimalclauses, PartScanKeyInfo *keys)
 {
 	PartitionClauseInfo *clauseinfo = context->clauseinfo;
 	bool		need_next_eq,
@@ -2563,7 +2576,7 @@ extract_bounding_datums(PartitionKey partkey, PartitionPruneContext *context,
 	memset(keys, 0, sizeof(PartScanKeyInfo));
 	for (i = 0; i < partkey->partnatts; i++)
 	{
-		List *clauselist = clauseinfo->keyclauses[i];
+		List *clauselist = minimalclauses[i];
 
 		/*
 		 * Min and max keys must constitute a prefix of the partition key and
@@ -2797,7 +2810,8 @@ partkey_datum_from_expr(PartitionKey key, int partkeyidx,
  */
 static void
 remove_redundant_clauses(PartitionKey partkey,
-						 PartitionPruneContext *context)
+						 PartitionPruneContext *context,
+						 List **minimalclauses)
 {
 	PartClause *hash_clause,
 			   *btree_clauses[BTMaxStrategyNumber];
@@ -2806,14 +2820,13 @@ remove_redundant_clauses(PartitionKey partkey,
 	int		s;
 	int		i;
 	bool	test_result;
-	List   *newlist;
 
 	for (i = 0; i < partkey->partnatts; i++)
 	{
 		List *keyclauses = partclauseinfo->keyclauses[i];
 
+		minimalclauses[i] = NIL;
 		hash_clause = NULL;
-		newlist = NIL;
 
 		memset(btree_clauses, 0, sizeof(btree_clauses));
 
@@ -2863,7 +2876,7 @@ remove_redundant_clauses(PartitionKey partkey,
 				 * partition-pruning with it.
 				 */
 				else
-					newlist = lappend(newlist, pc);
+					minimalclauses[i] = lappend(minimalclauses[i], pc);
 
 				/*
 				 * The code below handles btree operators, so not relevant for
@@ -2924,7 +2937,7 @@ remove_redundant_clauses(PartitionKey partkey,
 					 * the previous one in btree_clauses[s] and push this one directly
 					 * to the output list.
 					 */
-					newlist = lappend(newlist, pc);
+					minimalclauses[i] = lappend(minimalclauses[i], pc);
 				}
 			}
 		}
@@ -2933,9 +2946,7 @@ remove_redundant_clauses(PartitionKey partkey,
 		{
 			/* Note we didn't add this one to the result yet. */
 			if (hash_clause)
-				newlist = lappend(newlist, hash_clause);
-			list_free(partclauseinfo->keyclauses[i]);
-			partclauseinfo->keyclauses[i] = newlist;
+				minimalclauses[i] = lappend(minimalclauses[i], hash_clause);
 			continue;
 		}
 
@@ -3026,15 +3037,9 @@ remove_redundant_clauses(PartitionKey partkey,
 		for (s = 0; s < BTMaxStrategyNumber; s++)
 		{
 			if (btree_clauses[s])
-				newlist = lappend(newlist, btree_clauses[s]);
+				minimalclauses[i] = lappend(minimalclauses[i],
+											btree_clauses[s]);
 		}
-
-		/*
-		 * Replace the old List with the new one with the redundant clauses
-		 * removed.
-		 */
-		list_free(partclauseinfo->keyclauses[i]);
-		partclauseinfo->keyclauses[i] = newlist;
 	}
 }
 
diff --git a/src/backend/optimizer/path/allpaths.c b/src/backend/optimizer/path/allpaths.c
index af96581..f6a4e3d 100644
--- a/src/backend/optimizer/path/allpaths.c
+++ b/src/backend/optimizer/path/allpaths.c
@@ -875,21 +875,21 @@ get_append_rel_partitions(PlannerInfo *root,
 	{
 		Relation		partrel;
 		Bitmapset	   *partindexes;
-		PartitionClauseInfo partclauseinfo;
+		PartitionClauseInfo *partclauseinfo;
 
 		partrel = heap_open(rte->relid, NoLock);
 
-		/* Process clauses and populate partclauseinfo */
-		populate_partition_clauses(partrel, rel->relid,
-								   clauses, &partclauseinfo);
+		/* process clauses and generate the partclauseinfo */
+		partclauseinfo = generate_partition_clauses(partrel, rel->relid,
+													clauses);
 
-		if (!partclauseinfo.constfalse)
+		if (!partclauseinfo->constfalse)
 		{
 			PartitionPruneContext context;
 
 			context.rt_index = rel->relid;
 			context.relation = partrel;
-			context.clauseinfo = &partclauseinfo;
+			context.clauseinfo = partclauseinfo;
 
 			partindexes = get_partitions_from_clauses(&context);
 
diff --git a/src/include/catalog/partition.h b/src/include/catalog/partition.h
index 78d43ea..0631d3d 100644
--- a/src/include/catalog/partition.h
+++ b/src/include/catalog/partition.h
@@ -81,9 +81,8 @@ extern int get_partition_for_tuple(Relation relation, Datum *values,
 						bool *isnull);
 
 /* For partition-pruning */
-extern void populate_partition_clauses(Relation relation,
-							   int rt_index, List *clauses,
-							   PartitionClauseInfo *partclauseinfo);
+PartitionClauseInfo *generate_partition_clauses(Relation relation,
+						   int rt_index, List *clauses);
 extern Bitmapset *get_partitions_from_clauses(PartitionPruneContext *context);
 
 #endif							/* PARTITION_H */
diff --git a/src/include/nodes/primnodes.h b/src/include/nodes/primnodes.h
index 642ea0f..54c678b 100644
--- a/src/include/nodes/primnodes.h
+++ b/src/include/nodes/primnodes.h
@@ -1517,6 +1517,8 @@ typedef struct OnConflictExpr
  */
 typedef struct PartitionClauseInfo
 {
+	NodeTag		type;
+
 	/* Lists of clauses indexed by the partition key */
 	List   *keyclauses[PARTITION_MAX_KEYS];
 
