diff --git a/src/backend/optimizer/util/pathnode.c b/src/backend/optimizer/util/pathnode.c index 549909dfa0..e4f7cb97d1 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?