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:
parent
d77c6396bb
commit
e59750d684
@ -8,7 +8,7 @@
|
||||
*
|
||||
*
|
||||
* 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
|
||||
* 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 (;;)
|
||||
{
|
||||
@ -66,10 +71,16 @@ ExecUnique(Unique *node)
|
||||
*/
|
||||
slot = ExecProcNode(outerPlan, (Plan *) node);
|
||||
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;
|
||||
}
|
||||
|
||||
/*
|
||||
* Always return the first tuple from the subplan.
|
||||
* Always return the first/last tuple from the subplan.
|
||||
*/
|
||||
if (uniquestate->priorTuple == NULL)
|
||||
break;
|
||||
|
Loading…
x
Reference in New Issue
Block a user