diff options
Diffstat (limited to 'src/backend/executor/execTuples.c')
-rw-r--r-- | src/backend/executor/execTuples.c | 73 |
1 files changed, 37 insertions, 36 deletions
diff --git a/src/backend/executor/execTuples.c b/src/backend/executor/execTuples.c index 37b092fc20f..05474bc64bc 100644 --- a/src/backend/executor/execTuples.c +++ b/src/backend/executor/execTuples.c @@ -15,7 +15,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/executor/execTuples.c,v 1.38 2000/07/12 02:37:02 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/executor/execTuples.c,v 1.39 2000/09/12 21:06:48 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -46,11 +46,10 @@ * type of tuple in a slot * * CONVENIENCE INITIALIZATION ROUTINES - * ExecInitResultTupleSlot \ convience routines to initialize + * ExecInitResultTupleSlot \ convenience routines to initialize * ExecInitScanTupleSlot \ the various tuple slots for nodes - * ExecInitMarkedTupleSlot / which store copies of tuples. - * ExecInitOuterTupleSlot / - * ExecInitHashTupleSlot / + * ExecInitExtraTupleSlot / which store copies of tuples. + * ExecInitNullTupleSlot / * * old routines: * ExecGetTupType - get type of tuple returned by this node @@ -560,10 +559,11 @@ ExecSlotDescriptorIsNew(TupleTableSlot *slot) /* slot to inspect */ * ---------------------------------------------------------------- */ /* -------------------------------- - * ExecInit{Result,Scan,Raw,Marked,Outer,Hash}TupleSlot + * ExecInit{Result,Scan,Extra}TupleSlot * - * These are convenience routines to initialize the specfied slot - * in nodes inheriting the appropriate state. + * These are convenience routines to initialize the specified slot + * in nodes inheriting the appropriate state. ExecInitExtraTupleSlot + * is used for initializing special-purpose slots. * -------------------------------- */ #define INIT_SLOT_DEFS \ @@ -583,7 +583,7 @@ ExecInitResultTupleSlot(EState *estate, CommonState *commonstate) { INIT_SLOT_DEFS; INIT_SLOT_ALLOC; - commonstate->cs_ResultTupleSlot = (TupleTableSlot *) slot; + commonstate->cs_ResultTupleSlot = slot; } /* ---------------- @@ -595,50 +595,51 @@ ExecInitScanTupleSlot(EState *estate, CommonScanState *commonscanstate) { INIT_SLOT_DEFS; INIT_SLOT_ALLOC; - commonscanstate->css_ScanTupleSlot = (TupleTableSlot *) slot; + commonscanstate->css_ScanTupleSlot = slot; } -#ifdef NOT_USED /* ---------------- - * ExecInitMarkedTupleSlot + * ExecInitExtraTupleSlot * ---------------- */ -void -ExecInitMarkedTupleSlot(EState *estate, MergeJoinState *mergestate) +TupleTableSlot * +ExecInitExtraTupleSlot(EState *estate) { INIT_SLOT_DEFS; INIT_SLOT_ALLOC; - mergestate->mj_MarkedTupleSlot = (TupleTableSlot *) slot; + return slot; } -#endif - /* ---------------- - * ExecInitOuterTupleSlot + * ExecInitNullTupleSlot + * + * Build a slot containing an all-nulls tuple of the given type. + * This is used as a substitute for an input tuple when performing an + * outer join. * ---------------- */ -void -ExecInitOuterTupleSlot(EState *estate, HashJoinState *hashstate) +TupleTableSlot * +ExecInitNullTupleSlot(EState *estate, TupleDesc tupType) { - INIT_SLOT_DEFS; - INIT_SLOT_ALLOC; - hashstate->hj_OuterTupleSlot = slot; -} + TupleTableSlot* slot = ExecInitExtraTupleSlot(estate); + /* + * Since heap_getattr() will treat attributes beyond a tuple's t_natts + * as being NULL, we can make an all-nulls tuple just by making it be of + * zero length. However, the slot descriptor must match the real tupType. + */ + HeapTuple nullTuple; + Datum values[1]; + char nulls[1]; + static struct tupleDesc NullTupleDesc; /* we assume this inits to + * zeroes */ -/* ---------------- - * ExecInitHashTupleSlot - * ---------------- - */ -#ifdef NOT_USED -void -ExecInitHashTupleSlot(EState *estate, HashJoinState *hashstate) -{ - INIT_SLOT_DEFS; - INIT_SLOT_ALLOC; - hashstate->hj_HashTupleSlot = slot; + ExecSetSlotDescriptor(slot, tupType); + + nullTuple = heap_formtuple(&NullTupleDesc, values, nulls); + + return ExecStoreTuple(nullTuple, slot, InvalidBuffer, true); } -#endif static TupleTableSlot * NodeGetResultTupleSlot(Plan *node) |