From f685cbbac849064a170375e41fc36ad517f6210c Mon Sep 17 00:00:00 2001 From: Tom Lane <tgl@sss.pgh.pa.us> Date: Mon, 21 Jun 2010 00:14:48 +0000 Subject: [PATCH] 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. --- src/backend/optimizer/prep/prepjointree.c | 6 ++++- src/test/regress/expected/subselect.out | 30 +++++++++++++++++++++++ src/test/regress/sql/subselect.sql | 14 +++++++++++ 3 files changed, 49 insertions(+), 1 deletion(-) 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; diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out index 49ee53741b2..b0b260f1847 100644 --- a/src/test/regress/expected/subselect.out +++ b/src/test/regress/expected/subselect.out @@ -477,3 +477,33 @@ group by f1,f2,fs; ----+----+---- (0 rows) +-- +-- Test case for bug #5514 (mishandling of whole-row Vars in subselects) +-- +create temp table table_a(id integer); +insert into table_a values (42); +create temp view view_a as select * from table_a; +select view_a from view_a; + view_a +-------- + (42) +(1 row) + +select (select view_a) from view_a; + ?column? +---------- + (42) +(1 row) + +select (select (select view_a)) from view_a; + ?column? +---------- + (42) +(1 row) + +select (select (a.*)::text) from view_a a; + ?column? +---------- + (42) +(1 row) + diff --git a/src/test/regress/sql/subselect.sql b/src/test/regress/sql/subselect.sql index fd8d5df3a01..45be164d1d1 100644 --- a/src/test/regress/sql/subselect.sql +++ b/src/test/regress/sql/subselect.sql @@ -309,3 +309,17 @@ select * from (select distinct f1, f2, (select f2 from t1 x where x.f1 = up.f1) as fs from t1 up) ss group by f1,f2,fs; + +-- +-- Test case for bug #5514 (mishandling of whole-row Vars in subselects) +-- + +create temp table table_a(id integer); +insert into table_a values (42); + +create temp view view_a as select * from table_a; + +select view_a from view_a; +select (select view_a) from view_a; +select (select (select view_a)) from view_a; +select (select (a.*)::text) from view_a a; -- GitLab