*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/executor/nodeSort.c,v 1.9 1997/09/08 21:43:19 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/executor/nodeSort.c,v 1.10 1997/09/15 14:27:37 vadim Exp $
*
*-------------------------------------------------------------------------
*/
ScanKey sortkeys;
HeapTuple heapTuple;
TupleTableSlot *slot;
+ bool should_free;
/* ----------------
* get state info from node
* ----------------
*/
slot = (TupleTableSlot *) sortstate->csstate.cstate.cs_ResultTupleSlot;
- /* *** get_cs_ResultTupleSlot((CommonState) sortstate); */
-
slot->ttc_tupleDescriptor = ExecGetTupType(outerNode);
-#if 0
- slot->ttc_execTupDescriptor = ExecGetExecTupDesc(outerNode);
-#endif
/* ----------------
* finally set the sorted flag to true
* ----------------
* at this point we grab a tuple from psort
* ----------------
*/
- heapTuple = psort_grabtuple(node);
-
- if (heapTuple == NULL)
- {
-/* psort_end(node); */
- return (ExecClearTuple(slot));
- }
+ heapTuple = psort_grabtuple(node, &should_free);
- ExecStoreTuple(heapTuple, /* tuple to store */
- slot, /* slot to store in */
- InvalidBuffer, /* no buffer */
- true); /* free the palloc'd tuple */
-/* printf("ExecSort: (%x)",node);print_slot(slot);printf("\n");*/
- return slot;
-#if 0
- return ExecStoreTuple(heapTuple, /* tuple to store */
- slot, /* slot to store in */
- InvalidBuffer, /* no buffer */
- true);/* free the palloc'd tuple */
-#endif
+ return (ExecStoreTuple(heapTuple, slot, InvalidBuffer, should_free));
}
/* ----------------------------------------------------------------
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/utils/sort/Attic/psort.c,v 1.21 1997/09/08 21:49:33 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/utils/sort/Attic/psort.c,v 1.22 1997/09/15 14:28:42 vadim Exp $
*
* NOTES
* Sorts the first relation into the second relation.
bool empty; /* to answer: is child node empty? */
node->psortstate = (struct Psortstate *) palloc(sizeof(struct Psortstate));
- if (node->psortstate == NULL)
- return false;
AssertArg(nkeys >= 1);
AssertArg(key[0].sk_attno != 0);
* a NULL indicating the last tuple has been processed.
*/
HeapTuple
-psort_grabtuple(Sort *node)
+psort_grabtuple(Sort *node, bool *should_free)
{
register HeapTuple tup;
long tuplen;
/* Update current merged sort file position */
PS(node)->psort_current += tuplen;
-
+ *should_free = true;
return tup;
}
else
else
{
if (PS(node)->psort_current < PS(node)->tupcount)
- return PS(node)->memtuples[PS(node)->psort_current++];
+ {
+ *should_free = false;
+ return (PS(node)->memtuples[PS(node)->psort_current++]);
+ }
else
return NULL;
}
if (!node->cleaned)
{
Assert(node != (Sort *) NULL);
-/* Assert(PS(node) != (Psortstate *) NULL); */
-
/*
* I'm changing this because if we are sorting a relation with no
* tuples, psortstate is NULL.
*
* Copyright (c) 1994, Regents of the University of California
*
- * $Id: psort.h,v 1.10 1997/09/08 21:55:14 momjian Exp $
+ * $Id: psort.h,v 1.11 1997/09/15 14:29:01 vadim Exp $
*
*-------------------------------------------------------------------------
*/
/* psort.c */
extern bool psort_begin(Sort *node, int nkeys, ScanKey key);
-extern HeapTuple psort_grabtuple(Sort *node);
+extern HeapTuple psort_grabtuple(Sort *node, bool *should_free);
extern void psort_markpos(Sort *node);
extern void psort_restorepos(Sort *node);
extern void psort_end(Sort *node);