I think the attached patch will fix it for you.
regards, tom lane
Index: src/backend/utils/cache/plancache.c
===================================================================
RCS file: /cvsroot/pgsql/src/backend/utils/cache/plancache.c,v
retrieving revision 1.27
diff -c -r1.27 plancache.c
*** src/backend/utils/cache/plancache.c 11 Jun 2009 14:49:05 -0000 1.27
--- src/backend/utils/cache/plancache.c 14 Jul 2009 15:04:38 -0000
***************
*** 45,50 ****
--- 45,51 ----
#include "access/transam.h"
#include "catalog/namespace.h"
#include "executor/executor.h"
+ #include "executor/spi.h"
#include "nodes/nodeFuncs.h"
#include "optimizer/planmain.h"
#include "storage/lmgr.h"
***************
*** 502,509 ****
--- 503,521 ----
{
/*
* Generate plans for queries.
+ *
+ * The planner may try to call SPI-using functions, which causes
+ * a problem if we're already inside one. Rather than expect
+ * all SPI-using code to do SPI_push whenever a replan could
+ * happen, it seems best to take care of the case here.
*/
+ bool pushed;
+
+ pushed = SPI_push_conditional();
+
slist = pg_plan_queries(slist, plansource->cursor_options, NULL);
+
+ SPI_pop_conditional(pushed);
}
/*