Fix nodeUnique to behave correctly when reversing direction after reaching
authorTom Lane
Sun, 2 Feb 2003 19:08:57 +0000 (19:08 +0000)
committerTom Lane
Sun, 2 Feb 2003 19:08:57 +0000 (19:08 +0000)
either end of subplan results.  This prevents misbehavior of cursors
on SELECT DISTINCT ... queries.  Per bug report 1-Feb-02.

src/backend/executor/nodeUnique.c

index 7a0ccb0b14c8ce01b8bc3f77fc8dd5a4f08051ec..fb012a5cc4018fca22465c0a7b68e6d5d765e860 100644 (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;