diff options
Diffstat (limited to 'src/backend/optimizer')
-rw-r--r-- | src/backend/optimizer/path/allpaths.c | 25 | ||||
-rw-r--r-- | src/backend/optimizer/prep/prepjointree.c | 32 | ||||
-rw-r--r-- | src/backend/optimizer/util/var.c | 10 |
3 files changed, 41 insertions, 26 deletions
diff --git a/src/backend/optimizer/path/allpaths.c b/src/backend/optimizer/path/allpaths.c index 24a51149e45..d770c9175bc 100644 --- a/src/backend/optimizer/path/allpaths.c +++ b/src/backend/optimizer/path/allpaths.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/optimizer/path/allpaths.c,v 1.118 2004/06/05 01:55:04 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/optimizer/path/allpaths.c,v 1.119 2004/08/19 20:57:40 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -57,10 +57,10 @@ static void compare_tlist_datatypes(List *tlist, List *colTypes, bool *differentTypes); static bool qual_is_pushdown_safe(Query *subquery, Index rti, Node *qual, bool *differentTypes); -static void subquery_push_qual(Query *subquery, - RangeTblEntry *rte, Index rti, Node *qual); +static void subquery_push_qual(Query *subquery, List *rtable, + Index rti, Node *qual); static void recurse_push_qual(Node *setOp, Query *topquery, - RangeTblEntry *rte, Index rti, Node *qual); + List *rtable, Index rti, Node *qual); /* @@ -376,7 +376,7 @@ set_subquery_pathlist(Query *root, RelOptInfo *rel, if (qual_is_pushdown_safe(subquery, rti, clause, differentTypes)) { /* Push it down */ - subquery_push_qual(subquery, rte, rti, clause); + subquery_push_qual(subquery, root->rtable, rti, clause); } else { @@ -780,12 +780,13 @@ qual_is_pushdown_safe(Query *subquery, Index rti, Node *qual, * subquery_push_qual - push down a qual that we have determined is safe */ static void -subquery_push_qual(Query *subquery, RangeTblEntry *rte, Index rti, Node *qual) +subquery_push_qual(Query *subquery, List *rtable, Index rti, Node *qual) { if (subquery->setOperations != NULL) { /* Recurse to push it separately to each component query */ - recurse_push_qual(subquery->setOperations, subquery, rte, rti, qual); + recurse_push_qual(subquery->setOperations, subquery, + rtable, rti, qual); } else { @@ -799,7 +800,7 @@ subquery_push_qual(Query *subquery, RangeTblEntry *rte, Index rti, Node *qual) * This step also ensures that when we are pushing into a setop tree, * each component query gets its own copy of the qual. */ - qual = ResolveNew(qual, rti, 0, rte, + qual = ResolveNew(qual, rti, 0, rtable, subquery->targetList, CMD_SELECT, 0); subquery->havingQual = make_and_qual(subquery->havingQual, @@ -818,7 +819,7 @@ subquery_push_qual(Query *subquery, RangeTblEntry *rte, Index rti, Node *qual) */ static void recurse_push_qual(Node *setOp, Query *topquery, - RangeTblEntry *rte, Index rti, Node *qual) + List *rtable, Index rti, Node *qual) { if (IsA(setOp, RangeTblRef)) { @@ -827,14 +828,14 @@ recurse_push_qual(Node *setOp, Query *topquery, Query *subquery = subrte->subquery; Assert(subquery != NULL); - subquery_push_qual(subquery, rte, rti, qual); + subquery_push_qual(subquery, rtable, rti, qual); } else if (IsA(setOp, SetOperationStmt)) { SetOperationStmt *op = (SetOperationStmt *) setOp; - recurse_push_qual(op->larg, topquery, rte, rti, qual); - recurse_push_qual(op->rarg, topquery, rte, rti, qual); + recurse_push_qual(op->larg, topquery, rtable, rti, qual); + recurse_push_qual(op->rarg, topquery, rtable, rti, qual); } else { diff --git a/src/backend/optimizer/prep/prepjointree.c b/src/backend/optimizer/prep/prepjointree.c index 1eb4d5504a1..430ec9e5db7 100644 --- a/src/backend/optimizer/prep/prepjointree.c +++ b/src/backend/optimizer/prep/prepjointree.c @@ -16,7 +16,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/optimizer/prep/prepjointree.c,v 1.20 2004/05/30 23:40:29 neilc Exp $ + * $PostgreSQL: pgsql/src/backend/optimizer/prep/prepjointree.c,v 1.21 2004/08/19 20:57:40 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -46,7 +46,7 @@ typedef struct reduce_outer_joins_state static bool is_simple_subquery(Query *subquery); static bool has_nullable_targetlist(Query *subquery); static void resolvenew_in_jointree(Node *jtnode, int varno, - RangeTblEntry *rte, List *subtlist); + List *rtable, List *subtlist); static reduce_outer_joins_state *reduce_outer_joins_pass1(Node *jtnode); static void reduce_outer_joins_pass2(Node *jtnode, reduce_outer_joins_state *state, @@ -243,16 +243,19 @@ pull_up_subqueries(Query *parse, Node *jtnode, bool below_outer_join) subtlist = subquery->targetList; parse->targetList = (List *) ResolveNew((Node *) parse->targetList, - varno, 0, rte, subtlist, CMD_SELECT, 0); + varno, 0, parse->rtable, + subtlist, CMD_SELECT, 0); resolvenew_in_jointree((Node *) parse->jointree, varno, - rte, subtlist); + parse->rtable, subtlist); Assert(parse->setOperations == NULL); parse->havingQual = ResolveNew(parse->havingQual, - varno, 0, rte, subtlist, CMD_SELECT, 0); + varno, 0, parse->rtable, + subtlist, CMD_SELECT, 0); parse->in_info_list = (List *) ResolveNew((Node *) parse->in_info_list, - varno, 0, rte, subtlist, CMD_SELECT, 0); + varno, 0, parse->rtable, + subtlist, CMD_SELECT, 0); foreach(rt, parse->rtable) { @@ -261,7 +264,8 @@ pull_up_subqueries(Query *parse, Node *jtnode, bool below_outer_join) if (otherrte->rtekind == RTE_JOIN) otherrte->joinaliasvars = (List *) ResolveNew((Node *) otherrte->joinaliasvars, - varno, 0, rte, subtlist, CMD_SELECT, 0); + varno, 0, parse->rtable, + subtlist, CMD_SELECT, 0); } /* @@ -477,7 +481,7 @@ has_nullable_targetlist(Query *subquery) */ static void resolvenew_in_jointree(Node *jtnode, int varno, - RangeTblEntry *rte, List *subtlist) + List *rtable, List *subtlist) { if (jtnode == NULL) return; @@ -491,18 +495,20 @@ resolvenew_in_jointree(Node *jtnode, int varno, ListCell *l; foreach(l, f->fromlist) - resolvenew_in_jointree(lfirst(l), varno, rte, subtlist); + resolvenew_in_jointree(lfirst(l), varno, rtable, subtlist); f->quals = ResolveNew(f->quals, - varno, 0, rte, subtlist, CMD_SELECT, 0); + varno, 0, rtable, + subtlist, CMD_SELECT, 0); } else if (IsA(jtnode, JoinExpr)) { JoinExpr *j = (JoinExpr *) jtnode; - resolvenew_in_jointree(j->larg, varno, rte, subtlist); - resolvenew_in_jointree(j->rarg, varno, rte, subtlist); + resolvenew_in_jointree(j->larg, varno, rtable, subtlist); + resolvenew_in_jointree(j->rarg, varno, rtable, subtlist); j->quals = ResolveNew(j->quals, - varno, 0, rte, subtlist, CMD_SELECT, 0); + varno, 0, rtable, + subtlist, CMD_SELECT, 0); /* * We don't bother to update the colvars list, since it won't be diff --git a/src/backend/optimizer/util/var.c b/src/backend/optimizer/util/var.c index e46655e17db..94e0f15e289 100644 --- a/src/backend/optimizer/util/var.c +++ b/src/backend/optimizer/util/var.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/optimizer/util/var.c,v 1.59 2004/06/01 04:47:46 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/optimizer/util/var.c,v 1.60 2004/08/19 20:57:40 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -515,11 +515,19 @@ flatten_join_alias_vars_mutator(Node *node, /* Must expand whole-row reference */ RowExpr *rowexpr; List *fields = NIL; + AttrNumber attnum; ListCell *l; + attnum = 0; foreach(l, rte->joinaliasvars) { newvar = (Node *) lfirst(l); + attnum++; + /* Ignore dropped columns */ + if (get_rte_attribute_is_dropped(context->root->rtable, + var->varno, + attnum)) + continue; /* * If we are expanding an alias carried down from an upper * query, must adjust its varlevelsup fields. |