Teach is_distinct_query to recognize that GROUP BY forces a subquery's
authorTom Lane <tgl@sss.pgh.pa.us>
Tue, 2 Mar 2004 16:42:20 +0000 (16:42 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Tue, 2 Mar 2004 16:42:20 +0000 (16:42 +0000)
output to be distinct, if all the GROUP BY columns appear in the output.
Per suggestion from Dennis Haney.

src/backend/optimizer/util/pathnode.c

index 549909dfa0a7aa3837bb5cb074c43881a74d5203..e4f7cb97d15b458f9d9dbd7ba648f25852d455de 100644 (file)
@@ -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?