*** pgsql/contrib/tablefunc/tablefunc.c 2008/01/01 19:45:45 1.51 --- pgsql/contrib/tablefunc/tablefunc.c 2008/11/30 23:24:01 1.51.2.1 *************** crosstab(PG_FUNCTION_ARGS) *** 378,388 **** /* create a function context for cross-call persistence */ funcctx = SRF_FIRSTCALL_INIT(); - /* - * switch to memory context appropriate for multiple function calls - */ - oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx); - /* Connect to SPI manager */ if ((ret = SPI_connect()) < 0) /* internal error */ --- 378,383 ---- *************** crosstab(PG_FUNCTION_ARGS) *** 423,431 **** SRF_RETURN_DONE(funcctx); } - /* SPI switches context on us, so reset it */ - MemoryContextSwitchTo(funcctx->multi_call_memory_ctx); - /* get a tuple descriptor for our result type */ switch (get_call_result_type(fcinfo, NULL, &tupdesc)) { --- 418,423 ---- *************** crosstab(PG_FUNCTION_ARGS) *** 445,453 **** break; } - /* make sure we have a persistent copy of the tupdesc */ - tupdesc = CreateTupleDescCopy(tupdesc); - /* * Check that return tupdesc is compatible with the data we got from * SPI, at least based on number and type of attributes --- 437,442 ---- *************** crosstab(PG_FUNCTION_ARGS) *** 459,464 **** --- 448,461 ---- "incompatible"))); /* + * switch to memory context appropriate for multiple function calls + */ + oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx); + + /* make sure we have a persistent copy of the tupdesc */ + tupdesc = CreateTupleDescCopy(tupdesc); + + /* * Generate attribute metadata needed later to produce tuples from raw * C strings */