Index: src/backend/optimizer/path/costsize.c =================================================================== RCS file: /projects/cvsroot/pgsql-server/src/backend/optimizer/path/costsize.c,v retrieving revision 1.102 diff -u -r1.102 costsize.c --- src/backend/optimizer/path/costsize.c 2003/01/22 20:16:40 1.102 +++ src/backend/optimizer/path/costsize.c 2003/01/27 07:26:15 @@ -808,6 +808,15 @@ outerscansel = outer_rows / outer_path->parent->rows; innerscansel = inner_rows / inner_path->parent->rows; + /* If there is a UniquePath, then the actual number of rows to be + * merged will be less + */ + if (outer_path->type == T_UniquePath) + outer_rows = ((UniquePath*)outer_path)->rows; + + if (inner_path->type == T_UniquePath) + inner_rows = ((UniquePath*)inner_path)->rows; + /* cost of source data */ /* @@ -873,7 +882,7 @@ * counts here, not the scaled-down counts we obtained above. */ ntuples = approx_selectivity(root, mergeclauses) * - outer_path->parent->rows * inner_path->parent->rows; + outer_rows * inner_rows; /* CPU costs */ cost_qual_eval(&restrict_qual_cost, restrictlist); @@ -1556,18 +1565,14 @@ temp = outer_rel->rows; if (temp < inner_rel->rows) temp = inner_rel->rows; - break; - case JOIN_IN: - temp = outer_rel->rows * selec; - break; - case JOIN_REVERSE_IN: - temp = inner_rel->rows * selec; break; + case JOIN_REVERSE_IN: case JOIN_UNIQUE_OUTER: upath = create_unique_path(root, outer_rel, outer_rel->cheapest_total_path); temp = upath->rows * inner_rel->rows * selec; break; + case JOIN_IN: case JOIN_UNIQUE_INNER: upath = create_unique_path(root, inner_rel, inner_rel->cheapest_total_path);