]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Avoid division by zero in estimate_num_groups() when table has no rows.
authorTom Lane <tgl@sss.pgh.pa.us>
Thu, 16 Oct 2003 21:37:54 +0000 (21:37 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Thu, 16 Oct 2003 21:37:54 +0000 (21:37 +0000)
src/backend/utils/adt/selfuncs.c

index 2ea4dc3454a06db26450eb8beaac84c21d1c4619..978c0201466b60ef6578a21431b9219deb8e6374 100644 (file)
@@ -15,7 +15,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/utils/adt/selfuncs.c,v 1.146 2003/09/25 06:58:04 petere Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/utils/adt/selfuncs.c,v 1.147 2003/10/16 21:37:54 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -2166,17 +2166,23 @@ estimate_num_groups(Query *root, List *groupExprs, double input_rows)
                }
 
                /*
-                * Clamp to size of rel, multiply by restriction selectivity.
+                * Sanity check --- don't divide by zero if empty relation.
                 */
                Assert(rel->reloptkind == RELOPT_BASEREL);
-               if (reldistinct > rel->tuples)
-                       reldistinct = rel->tuples;
-               reldistinct *= rel->rows / rel->tuples;
+               if (rel->tuples > 0)
+               {
+                       /*
+                        * Clamp to size of rel, multiply by restriction selectivity.
+                        */
+                       if (reldistinct > rel->tuples)
+                               reldistinct = rel->tuples;
+                       reldistinct *= rel->rows / rel->tuples;
 
-               /*
-                * Update estimate of total distinct groups.
-                */
-               numdistinct *= reldistinct;
+                       /*
+                        * Update estimate of total distinct groups.
+                        */
+                       numdistinct *= reldistinct;
+               }
 
                varinfos = newvarinfos;
        } while (varinfos != NIL);