]> granicus.if.org Git - postgresql/commitdiff
Fix mishandling of whole-row Vars referencing a view or sub-select.
authorTom Lane <tgl@sss.pgh.pa.us>
Mon, 21 Jun 2010 00:14:48 +0000 (00:14 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Mon, 21 Jun 2010 00:14:48 +0000 (00:14 +0000)
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
src/test/regress/expected/subselect.out
src/test/regress/sql/subselect.sql

index bcc1fe2be33954e2417a6672f73cae6a25af7183..2f872e546c2a81567ed02fde5173ba6b2ac3e314 100644 (file)
@@ -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;
index 49ee53741b206686db1dd71095b72ec4c43d2a1c..b0b260f1847cc79f18bc89e2837927852d9b21ce 100644 (file)
@@ -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)
+
index fd8d5df3a01c72cc0ee409d33157e23e063bbb95..45be164d1d1cf52458306e9770c1e6c554fcc8b2 100644 (file)
@@ -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;