diff --git a/src/pl/plpython/plpy_spi.c b/src/pl/plpython/plpy_spi.c
index ff87b27de0..2fa6688f2e 100644
--- a/src/pl/plpython/plpy_spi.c
+++ b/src/pl/plpython/plpy_spi.c
@@ -222,6 +222,8 @@ PLy_spi_execute_plan(PyObject *ob, PyObject *list, long limit)
 	PG_TRY();
 	{
 		PLyExecutionContext *exec_ctx = PLy_current_execution_context();
+		MemoryContext scratch_context = PLy_get_scratch_context(exec_ctx);
+		MemoryContext oldcontext;
 		char	   *volatile nulls;
 		volatile int j;
 
@@ -230,6 +232,8 @@ PLy_spi_execute_plan(PyObject *ob, PyObject *list, long limit)
 		else
 			nulls = NULL;
 
+		MemoryContextReset(scratch_context);
+		oldcontext = MemoryContextSwitchTo(scratch_context);
 		for (j = 0; j < nargs; j++)
 		{
 			PLyObToDatum *arg = &plan->args[j];
@@ -249,6 +253,7 @@ PLy_spi_execute_plan(PyObject *ob, PyObject *list, long limit)
 			}
 			PG_END_TRY(2);
 		}
+		MemoryContextSwitchTo(oldcontext);
 
 		rv = SPI_execute_plan(plan->plan, plan->values, nulls,
 							  exec_ctx->curr_proc->fn_readonly, limit);
