diff --git a/src/backend/executor/nodeUnique.c b/src/backend/executor/nodeUnique.c
index 7a0ccb0b14c8ce01b8bc3f77fc8dd5a4f08051ec..fb012a5cc4018fca22465c0a7b68e6d5d765e860 100644
--- a/src/backend/executor/nodeUnique.c
+++ b/src/backend/executor/nodeUnique.c
@@ -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;