diff --git a/src/backend/optimizer/util/pathnode.c b/src/backend/optimizer/util/pathnode.c
index 549909dfa0a7aa3837bb5cb074c43881a74d5203..e4f7cb97d15b458f9d9dbd7ba648f25852d455de 100644
--- a/src/backend/optimizer/util/pathnode.c
+++ b/src/backend/optimizer/util/pathnode.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/optimizer/util/pathnode.c,v 1.101 2004/02/03 17:34:03 tgl Exp $
+ *	  $PostgreSQL: pgsql/src/backend/optimizer/util/pathnode.c,v 1.102 2004/03/02 16:42:20 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -25,6 +25,7 @@
 #include "optimizer/pathnode.h"
 #include "optimizer/paths.h"
 #include "optimizer/restrictinfo.h"
+#include "optimizer/tlist.h"
 #include "parser/parse_expr.h"
 #include "parser/parse_oper.h"
 #include "parser/parsetree.h"
@@ -688,6 +689,28 @@ is_distinct_query(Query *query)
 			return true;
 	}
 
+	/*
+	 * GROUP BY guarantees uniqueness if all the grouped columns appear in
+	 * the output.  In our implementation this means checking they are non
+	 * resjunk columns.
+	 */
+	if (query->groupClause)
+	{
+		List   *gl;
+
+		foreach(gl, query->groupClause)
+		{
+			GroupClause *grpcl = (GroupClause *) lfirst(gl);
+			TargetEntry *tle = get_sortgroupclause_tle(grpcl,
+													   query->targetList);
+
+			if (tle->resdom->resjunk)
+				break;
+		}
+		if (!gl)				/* got to the end? */
+			return true;
+	}
+
 	/*
 	 * XXX Are there any other cases in which we can easily see the result
 	 * must be distinct?