Commit adfa0429 authored by Tom Lane's avatar Tom Lane

Save a few cycles in EXPLAIN and related commands by not bothering to form

a physical tuple in do_tup_output().  A virtual tuple is easier to set up
and also easier for most tuple receivers to process.  Per my comment on
Robert Haas' recent patch in this code.
parent 6a0865e4
...@@ -15,7 +15,7 @@ ...@@ -15,7 +15,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/executor/execTuples.c,v 1.108 2009/07/22 17:00:20 tgl Exp $ * $PostgreSQL: pgsql/src/backend/executor/execTuples.c,v 1.109 2009/07/23 21:27:10 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -1215,27 +1215,28 @@ begin_tup_output_tupdesc(DestReceiver *dest, TupleDesc tupdesc) ...@@ -1215,27 +1215,28 @@ begin_tup_output_tupdesc(DestReceiver *dest, TupleDesc tupdesc)
/* /*
* write a single tuple * write a single tuple
*
* XXX This could be made more efficient, since in reality we probably only
* need a virtual tuple.
*/ */
void void
do_tup_output(TupOutputState *tstate, Datum *values, bool *isnull) do_tup_output(TupOutputState *tstate, Datum *values, bool *isnull)
{ {
TupleDesc tupdesc = tstate->slot->tts_tupleDescriptor; TupleTableSlot *slot = tstate->slot;
HeapTuple tuple; int natts = slot->tts_tupleDescriptor->natts;
/* form a tuple */ /* make sure the slot is clear */
tuple = heap_form_tuple(tupdesc, values, isnull); ExecClearTuple(slot);
/* put it in a slot */ /* insert data */
ExecStoreTuple(tuple, tstate->slot, InvalidBuffer, true); memcpy(slot->tts_values, values, natts * sizeof(Datum));
memcpy(slot->tts_isnull, isnull, natts * sizeof(bool));
/* mark slot as containing a virtual tuple */
ExecStoreVirtualTuple(slot);
/* send the tuple to the receiver */ /* send the tuple to the receiver */
(*tstate->dest->receiveSlot) (tstate->slot, tstate->dest); (*tstate->dest->receiveSlot) (slot, tstate->dest);
/* clean up */ /* clean up */
ExecClearTuple(tstate->slot); ExecClearTuple(slot);
} }
/* /*
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment