Fix nodeUnique to behave correctly when reversing direction after reaching

either end of subplan results.  This prevents misbehavior of cursors
on SELECT DISTINCT ... queries.  Per bug report 1-Feb-02.
This commit is contained in:
Tom Lane 2003-02-02 19:08:57 +00:00
parent 6ba8af9d5d
commit 967e8a37ab
1 changed files with 13 additions and 2 deletions

View File

@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/executor/nodeUnique.c,v 1.37 2003/01/10 23:54:24 tgl Exp $
* $Header: /cvsroot/pgsql/src/backend/executor/nodeUnique.c,v 1.38 2003/02/02 19:08:57 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@ -56,6 +56,11 @@ ExecUnique(UniqueState *node)
/*
* now loop, returning only non-duplicate tuples. We assume that the
* tuples arrive in sorted order so we can detect duplicates easily.
*
* We return the first tuple from each group of duplicates (or the
* last tuple of each group, when moving backwards). At either end
* of the subplan, clear priorTuple so that we correctly return the
* first/last tuple when reversing direction.
*/
for (;;)
{
@ -64,10 +69,16 @@ ExecUnique(UniqueState *node)
*/
slot = ExecProcNode(outerPlan);
if (TupIsNull(slot))
{
/* end of subplan; reset in case we change direction */
if (node->priorTuple != NULL)
heap_freetuple(node->priorTuple);
node->priorTuple = NULL;
return NULL;
}
/*
* Always return the first tuple from the subplan.
* Always return the first/last tuple from the subplan.
*/
if (node->priorTuple == NULL)
break;