1
0
mirror of https://github.com/postgres/postgres.git synced 2025-05-01 01:04:50 +03:00

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:09:08 +00:00
parent d77c6396bb
commit e59750d684

View File

@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/executor/nodeUnique.c,v 1.34 2002/06/20 20:29:28 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/executor/nodeUnique.c,v 1.34.2.1 2003/02/02 19:09:08 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -58,6 +58,11 @@ ExecUnique(Unique *node)
/* /*
* now loop, returning only non-duplicate tuples. We assume that the * now loop, returning only non-duplicate tuples. We assume that the
* tuples arrive in sorted order so we can detect duplicates easily. * 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 (;;) for (;;)
{ {
@ -66,10 +71,16 @@ ExecUnique(Unique *node)
*/ */
slot = ExecProcNode(outerPlan, (Plan *) node); slot = ExecProcNode(outerPlan, (Plan *) node);
if (TupIsNull(slot)) if (TupIsNull(slot))
{
/* end of subplan; reset in case we change direction */
if (uniquestate->priorTuple != NULL)
heap_freetuple(uniquestate->priorTuple);
uniquestate->priorTuple = NULL;
return NULL; return NULL;
}
/* /*
* Always return the first tuple from the subplan. * Always return the first/last tuple from the subplan.
*/ */
if (uniquestate->priorTuple == NULL) if (uniquestate->priorTuple == NULL)
break; break;