diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2010-06-21 00:14:48 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2010-06-21 00:14:48 +0000 |
commit | f685cbbac849064a170375e41fc36ad517f6210c (patch) | |
tree | 5c6e3c318703bb8604f04e053d564c3152e771b8 /src/backend/optimizer/prep/prepjointree.c | |
parent | 31c47e53aa4b951bdd54eb6b47590e6c9124e427 (diff) |
Fix mishandling of whole-row Vars referencing a view or sub-select.
If such a Var appeared within a nested sub-select, we failed to translate it
correctly during pullup of the view, because the recursive call to
replace_rte_variables_mutator was looking for the wrong sublevels_up value.
Bug was introduced during the addition of the PlaceHolderVar mechanism.
Per bug #5514 from Marcos Castedo.
Diffstat (limited to 'src/backend/optimizer/prep/prepjointree.c')
-rw-r--r-- | src/backend/optimizer/prep/prepjointree.c | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/src/backend/optimizer/prep/prepjointree.c b/src/backend/optimizer/prep/prepjointree.c index bcc1fe2be33..2f872e546c2 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.71 2010/02/26 02:00:46 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/optimizer/prep/prepjointree.c,v 1.72 2010/06/21 00:14:48 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -1297,6 +1297,7 @@ pullup_replace_vars_callback(Var *var, List *colnames; List *fields; bool save_need_phvs = rcon->need_phvs; + int save_sublevelsup = context->sublevels_up; /* * If generating an expansion for a var of a named rowtype (ie, this @@ -1314,9 +1315,12 @@ pullup_replace_vars_callback(Var *var, &colnames, &fields); /* Adjust the generated per-field Vars, but don't insert PHVs */ rcon->need_phvs = false; + context->sublevels_up = 0; /* to match the expandRTE output */ fields = (List *) replace_rte_variables_mutator((Node *) fields, context); rcon->need_phvs = save_need_phvs; + context->sublevels_up = save_sublevelsup; + rowexpr = makeNode(RowExpr); rowexpr->args = fields; rowexpr->row_typeid = var->vartype; |