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