diff options
author | Heikki Linnakangas <heikki.linnakangas@iki.fi> | 2009-12-29 17:40:59 +0000 |
---|---|---|
committer | Heikki Linnakangas <heikki.linnakangas@iki.fi> | 2009-12-29 17:40:59 +0000 |
commit | 84d723b6cefcf25b8c800f8aa6cf3c9538a546b4 (patch) | |
tree | fa91ab7b2bc60f3d602a330bc68b78ae8beab69b /src/backend/executor | |
parent | 50ef9f7b0612c755097bbddd7f2985237030c31a (diff) | |
download | postgresql-84d723b6cefcf25b8c800f8aa6cf3c9538a546b4.tar.gz postgresql-84d723b6cefcf25b8c800f8aa6cf3c9538a546b4.zip |
Previous fix for temporary file management broke returning a set from
PL/pgSQL function within an exception handler. Make sure we use the right
resource owner when we create the tuplestore to hold returned tuples.
Simplify tuplestore API so that the caller doesn't need to be in the right
memory context when calling tuplestore_put* functions. tuplestore.c
automatically switches to the memory context used when the tuplestore was
created. Tuplesort was already modified like this earlier. This patch also
removes the now useless MemoryContextSwitch calls from callers.
Report by Aleksei on pgsql-bugs on Dec 22 2009. Backpatch to 8.1, like
the previous patch that broke this.
Diffstat (limited to 'src/backend/executor')
-rw-r--r-- | src/backend/executor/execQual.c | 7 | ||||
-rw-r--r-- | src/backend/executor/functions.c | 5 | ||||
-rw-r--r-- | src/backend/executor/nodeWindowAgg.c | 4 | ||||
-rw-r--r-- | src/backend/executor/tstoreReceiver.c | 5 |
4 files changed, 5 insertions, 16 deletions
diff --git a/src/backend/executor/execQual.c b/src/backend/executor/execQual.c index 93b668181ff..a5604537515 100644 --- a/src/backend/executor/execQual.c +++ b/src/backend/executor/execQual.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/executor/execQual.c,v 1.256 2009/12/14 02:15:49 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/executor/execQual.c,v 1.257 2009/12/29 17:40:59 heikki Exp $ * *------------------------------------------------------------------------- */ @@ -2038,15 +2038,10 @@ ExecMakeTableFunctionResult(ExprState *funcexpr, tmptup.t_len = HeapTupleHeaderGetDatumLength(td); tmptup.t_data = td; - oldcontext = MemoryContextSwitchTo(econtext->ecxt_per_query_memory); tuplestore_puttuple(tupstore, &tmptup); } else - { - oldcontext = MemoryContextSwitchTo(econtext->ecxt_per_query_memory); tuplestore_putvalues(tupstore, tupdesc, &result, &fcinfo.isnull); - } - MemoryContextSwitchTo(oldcontext); /* * Are we done? diff --git a/src/backend/executor/functions.c b/src/backend/executor/functions.c index 8ac98236ec3..3b269668d26 100644 --- a/src/backend/executor/functions.c +++ b/src/backend/executor/functions.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/executor/functions.c,v 1.138 2009/12/15 04:57:47 rhaas Exp $ + * $PostgreSQL: pgsql/src/backend/executor/functions.c,v 1.139 2009/12/29 17:40:59 heikki Exp $ * *------------------------------------------------------------------------- */ @@ -1405,15 +1405,12 @@ static void sqlfunction_receive(TupleTableSlot *slot, DestReceiver *self) { DR_sqlfunction *myState = (DR_sqlfunction *) self; - MemoryContext oldcxt; /* Filter tuple as needed */ slot = ExecFilterJunk(myState->filter, slot); /* Store the filtered tuple into the tuplestore */ - oldcxt = MemoryContextSwitchTo(myState->cxt); tuplestore_puttupleslot(myState->tstore, slot); - MemoryContextSwitchTo(oldcxt); } /* diff --git a/src/backend/executor/nodeWindowAgg.c b/src/backend/executor/nodeWindowAgg.c index acc2f55ea94..ea28e09eae2 100644 --- a/src/backend/executor/nodeWindowAgg.c +++ b/src/backend/executor/nodeWindowAgg.c @@ -27,7 +27,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/executor/nodeWindowAgg.c,v 1.7 2009/09/27 21:10:53 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/executor/nodeWindowAgg.c,v 1.8 2009/12/29 17:40:59 heikki Exp $ * *------------------------------------------------------------------------- */ @@ -723,7 +723,7 @@ spool_tuples(WindowAggState *winstate, int64 pos) outerPlan = outerPlanState(winstate); - /* Must be in query context to call outerplan or touch tuplestore */ + /* Must be in query context to call outerplan */ oldcontext = MemoryContextSwitchTo(winstate->ss.ps.ps_ExprContext->ecxt_per_query_memory); while (winstate->spooled_rows <= pos || pos == -1) diff --git a/src/backend/executor/tstoreReceiver.c b/src/backend/executor/tstoreReceiver.c index 19f348f13f6..9ce61ec5c8e 100644 --- a/src/backend/executor/tstoreReceiver.c +++ b/src/backend/executor/tstoreReceiver.c @@ -13,7 +13,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/executor/tstoreReceiver.c,v 1.23 2009/06/11 14:48:57 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/executor/tstoreReceiver.c,v 1.24 2009/12/29 17:40:59 heikki Exp $ * *------------------------------------------------------------------------- */ @@ -94,11 +94,8 @@ static void tstoreReceiveSlot_notoast(TupleTableSlot *slot, DestReceiver *self) { TStoreState *myState = (TStoreState *) self; - MemoryContext oldcxt = MemoryContextSwitchTo(myState->cxt); tuplestore_puttupleslot(myState->tstore, slot); - - MemoryContextSwitchTo(oldcxt); } /* |