]> granicus.if.org Git - postgresql/commitdiff
When we have successfully optimized a MIN or MAX aggregate into an indexscan,
authorTom Lane <tgl@sss.pgh.pa.us>
Thu, 27 Mar 2008 19:06:14 +0000 (19:06 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Thu, 27 Mar 2008 19:06:14 +0000 (19:06 +0000)
the query result must be exactly one row (since we don't do this when there's
any GROUP BY).  Therefore any ORDER BY or DISTINCT attached to the query is
useless and can be dropped.  Aside from saving useless cycles, this protects
us against problems with matching the hacked-up tlist entries to sort clauses,
as seen in a bug report from Taiki Yamaguchi.  We might need to work harder
if we ever try to optimize grouped queries with this approach, but this
solution will do for now.

src/backend/optimizer/plan/planner.c

index 2f469bd924e1c56d5344f8edee5a1f49d2c8fd7d..6d6978dcf5bf616fc359284bdd51cd5cb74abe91 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/optimizer/plan/planner.c,v 1.227 2008/03/18 22:04:14 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/optimizer/plan/planner.c,v 1.228 2008/03/27 19:06:14 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -950,6 +950,17 @@ grouping_planner(PlannerInfo *root, double tuple_fraction)
                         * right tlist, and it has no sort order.
                         */
                        current_pathkeys = NIL;
+                       /*
+                        * In fact, since we don't optimize grouped aggregates, it
+                        * needs no sort order --- there must be exactly one output row,
+                        * and so any ORDER BY or DISTINCT attached to the query is
+                        * useless and can be dropped.  Aside from saving useless cycles,
+                        * this protects us against problems with matching the hacked-up
+                        * tlist entries to sort clauses.
+                        */
+                       Assert(!parse->groupClause);
+                       parse->sortClause = NULL;
+                       parse->distinctClause = NULL;
                }
                else
                {