@ -38,7 +38,7 @@
* Portions Copyright ( c ) 1994 , Regents of the University of California
*
* IDENTIFICATION
* $ PostgreSQL : pgsql / src / backend / utils / sort / tuplestore . c , v 1.36 2008 / 01 / 01 19 : 45 : 55 momjian Exp $
* $ PostgreSQL : pgsql / src / backend / utils / sort / tuplestore . c , v 1.36 .2 .1 2009 / 12 / 29 17 : 41 : 18 heikki Exp $
*
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
*/
@ -50,6 +50,7 @@
# include "executor/executor.h"
# include "storage/buffile.h"
# include "utils/memutils.h"
# include "utils/resowner.h"
# include "utils/tuplestore.h"
@ -74,6 +75,8 @@ struct Tuplestorestate
bool interXact ; /* keep open through transactions? */
long availMem ; /* remaining memory available, in bytes */
BufFile * myfile ; /* underlying file, or NULL if none */
MemoryContext context ; /* memory context for holding tuples */
ResourceOwner resowner ; /* resowner for holding temp files */
/*
* These function pointers decouple the routines that must know what kind
@ -225,6 +228,8 @@ tuplestore_begin_common(int eflags, bool interXact, int maxKBytes)
state - > interXact = interXact ;
state - > availMem = maxKBytes * 1024L ;
state - > myfile = NULL ;
state - > context = CurrentMemoryContext ;
state - > resowner = CurrentResourceOwner ;
state - > memtupcount = 0 ;
state - > memtupsize = 1024 ; /* initial guess */
@ -250,9 +255,9 @@ tuplestore_begin_common(int eflags, bool interXact, int maxKBytes)
*
* interXact : if true , the files used for on - disk storage persist beyond the
* end of the current transaction . NOTE : It ' s the caller ' s responsibility to
* create such a tuplestore in a memory context that will also survive
* transaction boundaries , and to ensure the tuplestore is closed when it ' s
* no longer wanted .
* create such a tuplestore in a memory context and resource owner that will
* also survive transaction boundaries , and to ensure the tuplestore is closed
* when it ' s no longer wanted .
*
* maxKBytes : how much data to store in memory ( any data beyond this
* amount is paged to disk ) . When in doubt , use work_mem .
@ -353,6 +358,7 @@ tuplestore_puttupleslot(Tuplestorestate *state,
TupleTableSlot * slot )
{
MinimalTuple tuple ;
MemoryContext oldcxt = MemoryContextSwitchTo ( state - > context ) ;
/*
* Form a MinimalTuple in working memory
@ -361,6 +367,8 @@ tuplestore_puttupleslot(Tuplestorestate *state,
USEMEM ( state , GetMemoryChunkSpace ( tuple ) ) ;
tuplestore_puttuple_common ( state , ( void * ) tuple ) ;
MemoryContextSwitchTo ( oldcxt ) ;
}
/*
@ -372,17 +380,23 @@ tuplestore_puttupleslot(Tuplestorestate *state,
void
tuplestore_puttuple ( Tuplestorestate * state , HeapTuple tuple )
{
MemoryContext oldcxt = MemoryContextSwitchTo ( state - > context ) ;
/*
* Copy the tuple . ( Must do this even in WRITEFILE case . )
*/
tuple = COPYTUP ( state , tuple ) ;
tuplestore_puttuple_common ( state , ( void * ) tuple ) ;
MemoryContextSwitchTo ( oldcxt ) ;
}
static void
tuplestore_puttuple_common ( Tuplestorestate * state , void * tuple )
{
ResourceOwner oldowner ;
switch ( state - > status )
{
case TSS_INMEM :
@ -429,7 +443,15 @@ tuplestore_puttuple_common(Tuplestorestate *state, void *tuple)
* the temp file ( s ) are created in suitable temp tablespaces .
*/
PrepareTempTablespaces ( ) ;
/* associate the file with the store's resource owner */
oldowner = CurrentResourceOwner ;
CurrentResourceOwner = state - > resowner ;
state - > myfile = BufFileCreateTemp ( state - > interXact ) ;
CurrentResourceOwner = oldowner ;
state - > status = TSS_WRITEFILE ;
dumptuples ( state ) ;
break ;