|
|
|
|
@ -41,7 +41,7 @@ |
|
|
|
|
* Portions Copyright (c) 1994, Regents of the University of California |
|
|
|
|
* |
|
|
|
|
* IDENTIFICATION |
|
|
|
|
* $Header: /cvsroot/pgsql/src/backend/optimizer/path/costsize.c,v 1.67 2001/02/15 17:46:40 tgl Exp $ |
|
|
|
|
* $Header: /cvsroot/pgsql/src/backend/optimizer/path/costsize.c,v 1.68 2001/02/16 00:03:07 tgl Exp $ |
|
|
|
|
* |
|
|
|
|
*------------------------------------------------------------------------- |
|
|
|
|
*/ |
|
|
|
|
@ -837,11 +837,12 @@ void |
|
|
|
|
set_joinrel_size_estimates(Query *root, RelOptInfo *rel, |
|
|
|
|
RelOptInfo *outer_rel, |
|
|
|
|
RelOptInfo *inner_rel, |
|
|
|
|
JoinType jointype, |
|
|
|
|
List *restrictlist) |
|
|
|
|
{ |
|
|
|
|
double temp; |
|
|
|
|
|
|
|
|
|
/* cartesian product */ |
|
|
|
|
/* Start with the Cartesian product */ |
|
|
|
|
temp = outer_rel->rows * inner_rel->rows; |
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
@ -854,6 +855,35 @@ set_joinrel_size_estimates(Query *root, RelOptInfo *rel, |
|
|
|
|
restrictlist, |
|
|
|
|
0); |
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* If we are doing an outer join, take that into account: the output |
|
|
|
|
* must be at least as large as the non-nullable input. (Is there any |
|
|
|
|
* chance of being even smarter?) |
|
|
|
|
*/ |
|
|
|
|
switch (jointype) |
|
|
|
|
{ |
|
|
|
|
case JOIN_INNER: |
|
|
|
|
break; |
|
|
|
|
case JOIN_LEFT: |
|
|
|
|
if (temp < outer_rel->rows) |
|
|
|
|
temp = outer_rel->rows; |
|
|
|
|
break; |
|
|
|
|
case JOIN_RIGHT: |
|
|
|
|
if (temp < inner_rel->rows) |
|
|
|
|
temp = inner_rel->rows; |
|
|
|
|
break; |
|
|
|
|
case JOIN_FULL: |
|
|
|
|
if (temp < outer_rel->rows) |
|
|
|
|
temp = outer_rel->rows; |
|
|
|
|
if (temp < inner_rel->rows) |
|
|
|
|
temp = inner_rel->rows; |
|
|
|
|
break; |
|
|
|
|
default: |
|
|
|
|
elog(ERROR, "set_joinrel_size_estimates: unsupported join type %d", |
|
|
|
|
(int) jointype); |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Force estimate to be at least one row, to make explain output look |
|
|
|
|
* better and to avoid possible divide-by-zero when interpolating |
|
|
|
|
@ -861,6 +891,7 @@ set_joinrel_size_estimates(Query *root, RelOptInfo *rel, |
|
|
|
|
*/ |
|
|
|
|
if (temp < 1.0) |
|
|
|
|
temp = 1.0; |
|
|
|
|
|
|
|
|
|
rel->rows = temp; |
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
|