Fix an Assert that turns out to be reachable after all.
authorTom Lane <tgl@sss.pgh.pa.us>
Mon, 9 Apr 2012 15:58:24 +0000 (11:58 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Mon, 9 Apr 2012 15:58:24 +0000 (11:58 -0400)
estimate_num_groups() gets unhappy with
create table empty();
select * from empty except select * from empty e2;
I can't see any actual use-case for such a query (and the table is illegal
per SQL spec), but it seems like a good idea that it not cause an assert
failure.

src/backend/utils/adt/selfuncs.c

index ced40484c4a6f00914be869aa112005e6546544c..83e43a999722e396ff3466813839d7e069472d07 100644 (file)
@@ -3182,8 +3182,13 @@ estimate_num_groups(PlannerInfo *root, List *groupExprs, double input_rows)
    double      numdistinct;
    ListCell   *l;
 
-   /* We should not be called unless query has GROUP BY (or DISTINCT) */
-   Assert(groupExprs != NIL);
+   /*
+    * If no grouping columns, there's exactly one group.  (This can't happen
+    * for normal cases with GROUP BY or DISTINCT, but it is possible for
+    * corner cases with set operations.)
+    */
+   if (groupExprs == NIL)
+       return 1.0;
 
    /*
     * Count groups derived from boolean grouping expressions.  For other