 src/backend/executor/execPartition.c | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

diff --git a/src/backend/executor/execPartition.c b/src/backend/executor/execPartition.c
index 7a4665c..6cac31b 100644
--- a/src/backend/executor/execPartition.c
+++ b/src/backend/executor/execPartition.c
@@ -42,7 +42,7 @@ static void FormPartitionKeyDatum(PartitionDispatch pd,
 					  Datum *values,
 					  bool *isnull);
 static int get_partition_for_tuple(Relation relation, Datum *values,
-						bool *isnull);
+								   bool *isnull, EState *estate);
 static char *ExecBuildSlotPartitionKeyDescription(Relation rel,
 									 Datum *values,
 									 bool *isnull,
@@ -251,7 +251,7 @@ ExecFindPartition(ResultRelInfo *resultRelInfo, PartitionDispatch *pd,
 			break;
 		}
 
-		cur_index = get_partition_for_tuple(rel, values, isnull);
+		cur_index = get_partition_for_tuple(rel, values, isnull, estate);
 
 		/*
 		 * cur_index < 0 means we failed to find a partition of this parent.
@@ -1079,14 +1079,17 @@ FormPartitionKeyDatum(PartitionDispatch pd,
  * found or -1 if none found.
  */
 static int
-get_partition_for_tuple(Relation relation, Datum *values, bool *isnull)
+get_partition_for_tuple(Relation relation, Datum *values, bool *isnull,
+						EState *estate)
 {
 	int			bound_offset;
 	int			part_index = -1;
 	PartitionKey key = RelationGetPartitionKey(relation);
 	PartitionDesc partdesc = RelationGetPartitionDesc(relation);
 	PartitionBoundInfo boundinfo = partdesc->boundinfo;
+	MemoryContext oldcxt;
 
+	oldcxt = MemoryContextSwitchTo(GetPerTupleMemoryContext(estate));
 	/* Route as appropriate based on partitioning strategy. */
 	switch (key->strategy)
 	{
@@ -1166,6 +1169,7 @@ get_partition_for_tuple(Relation relation, Datum *values, bool *isnull)
 			elog(ERROR, "unexpected partition strategy: %d",
 				 (int) key->strategy);
 	}
+	MemoryContextSwitchTo(oldcxt);
 
 	/*
 	 * part_index < 0 means we failed to find a partition of this parent. Use
