diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2004-08-19 20:57:41 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2004-08-19 20:57:41 +0000 |
commit | bbd6eb5b958ef38f786089fd4a03d650d4b7220e (patch) | |
tree | 3dbc25578ccd347b586018f6b8a6d8d6baa84ac7 /src/backend/optimizer/prep/prepjointree.c | |
parent | 040450beef4f3fdafaa9e20dbb0ee3e00c5856ba (diff) | |
download | postgresql-bbd6eb5b958ef38f786089fd4a03d650d4b7220e.tar.gz postgresql-bbd6eb5b958ef38f786089fd4a03d650d4b7220e.zip |
Repair some issues with column aliases and RowExpr construction in the
presence of dropped columns. Document the already-presumed fact that
eref aliases in relation RTEs are supposed to have entries for dropped
columns; cause the user alias structs to have such entries too, so that
there's always a one-to-one mapping to the underlying physical attnums.
Adjust expandRTE() and related code to handle the case where a column
that is part of a JOIN has been dropped. Generalize expandRTE()'s API
so that it can be used in a couple of places that formerly rolled their
own implementation of the same logic. Fix ruleutils.c to suppress
display of aliases for columns that were dropped since the rule was made.
Diffstat (limited to 'src/backend/optimizer/prep/prepjointree.c')
-rw-r--r-- | src/backend/optimizer/prep/prepjointree.c | 32 |
1 files changed, 19 insertions, 13 deletions
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 |