mirror of
https://github.com/postgres/postgres.git
synced 2025-05-05 09:19:17 +03:00
tuples with less header overhead than a regular HeapTuple, per my recent proposal. Teach TupleTableSlot code how to deal with these. As proof of concept, change tuplestore.c to store MinimalTuples instead of HeapTuples. Future patches will expand the concept to other places where it is useful.
91 lines
1.9 KiB
C
91 lines
1.9 KiB
C
/*-------------------------------------------------------------------------
|
|
*
|
|
* tstoreReceiver.c
|
|
* an implementation of DestReceiver that stores the result tuples in
|
|
* a Tuplestore
|
|
*
|
|
*
|
|
* Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group
|
|
* Portions Copyright (c) 1994, Regents of the University of California
|
|
*
|
|
* IDENTIFICATION
|
|
* $PostgreSQL: pgsql/src/backend/executor/tstoreReceiver.c,v 1.17 2006/06/27 02:51:39 tgl Exp $
|
|
*
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
|
|
#include "postgres.h"
|
|
|
|
#include "executor/tstoreReceiver.h"
|
|
|
|
|
|
typedef struct
|
|
{
|
|
DestReceiver pub;
|
|
Tuplestorestate *tstore;
|
|
MemoryContext cxt;
|
|
} TStoreState;
|
|
|
|
|
|
/*
|
|
* Prepare to receive tuples from executor.
|
|
*/
|
|
static void
|
|
tstoreStartupReceiver(DestReceiver *self, int operation, TupleDesc typeinfo)
|
|
{
|
|
/* do nothing */
|
|
}
|
|
|
|
/*
|
|
* Receive a tuple from the executor and store it in the tuplestore.
|
|
*/
|
|
static void
|
|
tstoreReceiveSlot(TupleTableSlot *slot, DestReceiver *self)
|
|
{
|
|
TStoreState *myState = (TStoreState *) self;
|
|
MemoryContext oldcxt = MemoryContextSwitchTo(myState->cxt);
|
|
|
|
tuplestore_puttupleslot(myState->tstore, slot);
|
|
|
|
MemoryContextSwitchTo(oldcxt);
|
|
}
|
|
|
|
/*
|
|
* Clean up at end of an executor run
|
|
*/
|
|
static void
|
|
tstoreShutdownReceiver(DestReceiver *self)
|
|
{
|
|
/* do nothing */
|
|
}
|
|
|
|
/*
|
|
* Destroy receiver when done with it
|
|
*/
|
|
static void
|
|
tstoreDestroyReceiver(DestReceiver *self)
|
|
{
|
|
pfree(self);
|
|
}
|
|
|
|
/*
|
|
* Initially create a DestReceiver object.
|
|
*/
|
|
DestReceiver *
|
|
CreateTuplestoreDestReceiver(Tuplestorestate *tStore,
|
|
MemoryContext tContext)
|
|
{
|
|
TStoreState *self = (TStoreState *) palloc(sizeof(TStoreState));
|
|
|
|
self->pub.receiveSlot = tstoreReceiveSlot;
|
|
self->pub.rStartup = tstoreStartupReceiver;
|
|
self->pub.rShutdown = tstoreShutdownReceiver;
|
|
self->pub.rDestroy = tstoreDestroyReceiver;
|
|
self->pub.mydest = DestTuplestore;
|
|
|
|
self->tstore = tStore;
|
|
self->cxt = tContext;
|
|
|
|
return (DestReceiver *) self;
|
|
}
|