]> granicus.if.org Git - postgresql/commitdiff
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?