diff options
Diffstat (limited to 'src/backend/optimizer/plan/planner.c')
-rw-r--r-- | src/backend/optimizer/plan/planner.c | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/src/backend/optimizer/plan/planner.c b/src/backend/optimizer/plan/planner.c index adb1bce37ee..91ce6f99c1b 100644 --- a/src/backend/optimizer/plan/planner.c +++ b/src/backend/optimizer/plan/planner.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/optimizer/plan/planner.c,v 1.80 2000/05/30 00:49:47 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/optimizer/plan/planner.c,v 1.81 2000/06/09 01:44:14 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -106,6 +106,9 @@ planner(Query *parse) Plan * subquery_planner(Query *parse, double tuple_fraction) { + List *l; + List *rangetable = parse->rtable; + RangeTblEntry *rangeTblEntry; /* * A HAVING clause without aggregates is equivalent to a WHERE clause @@ -138,6 +141,18 @@ subquery_planner(Query *parse, double tuple_fraction) parse->qual = eval_const_expressions(parse->qual); parse->havingQual = eval_const_expressions(parse->havingQual); + /* + * If the query is going to look for subclasses, but no subclasses + * actually exist, then we can optimise away the union that would + * otherwise happen and thus save some time. + */ + foreach(l, rangetable) + { + rangeTblEntry = (RangeTblEntry *)lfirst(l); + if (rangeTblEntry->inh && !has_subclass(rangeTblEntry->relid)) + rangeTblEntry->inh = FALSE; + } + /* * Canonicalize the qual, and convert it to implicit-AND format. * |