]> granicus.if.org Git - postgresql/commitdiff
Fix whole-row references in postgres_fdw.
authorTom Lane <tgl@sss.pgh.pa.us>
Fri, 22 Feb 2013 14:21:50 +0000 (09:21 -0500)
committerTom Lane <tgl@sss.pgh.pa.us>
Fri, 22 Feb 2013 14:21:50 +0000 (09:21 -0500)
The optimization to not retrieve unnecessary columns wasn't smart enough.
Noted by Thom Brown.

contrib/postgres_fdw/deparse.c
contrib/postgres_fdw/expected/postgres_fdw.out
contrib/postgres_fdw/sql/postgres_fdw.sql

index 93f2541cfc18e38b73af5ec19fccccf08e5667c8..0293115054f07e8a54f62020484b7939b9590ef6 100644 (file)
@@ -364,6 +364,7 @@ deparseSimpleSql(StringInfo buf,
 {
        RangeTblEntry *rte = root->simple_rte_array[baserel->relid];
        Bitmapset  *attrs_used = NULL;
+       bool            have_wholerow;
        bool            first;
        AttrNumber      attr;
        ListCell   *lc;
@@ -381,6 +382,10 @@ deparseSimpleSql(StringInfo buf,
                                           &attrs_used);
        }
 
+       /* If there's a whole-row reference, we'll need all the columns. */
+       have_wholerow = bms_is_member(0 - FirstLowInvalidHeapAttributeNumber,
+                                                                 attrs_used);
+
        /*
         * Construct SELECT list
         *
@@ -401,7 +406,8 @@ deparseSimpleSql(StringInfo buf,
                        appendStringInfo(buf, ", ");
                first = false;
 
-               if (bms_is_member(attr - FirstLowInvalidHeapAttributeNumber,
+               if (have_wholerow ||
+                       bms_is_member(attr - FirstLowInvalidHeapAttributeNumber,
                                                  attrs_used))
                        deparseColumnRef(buf, baserel->relid, attr, root);
                else
index 8af496a54679e1722086753767231381961e041d..f8418baba30c06eff47aa381ab0b7d72eab66434 100644 (file)
@@ -180,6 +180,35 @@ SELECT * FROM ft1 t1 ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10;
  110 |  0 | 00110 | Sun Jan 11 00:00:00 1970 PST | Sun Jan 11 00:00:00 1970 | 0  | 0          | foo
 (10 rows)
 
+-- whole-row reference
+EXPLAIN (VERBOSE, COSTS false) SELECT t1 FROM ft1 t1 ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10;
+                                     QUERY PLAN                                      
+-------------------------------------------------------------------------------------
+ Limit
+   Output: t1.*, c3, c1
+   ->  Sort
+         Output: t1.*, c3, c1
+         Sort Key: t1.c3, t1.c1
+         ->  Foreign Scan on public.ft1 t1
+               Output: t1.*, c3, c1
+               Remote SQL: SELECT "C 1", c2, c3, c4, c5, c6, c7, c8 FROM "S 1"."T 1"
+(8 rows)
+
+SELECT t1 FROM ft1 t1 ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10;
+                                             t1                                             
+--------------------------------------------------------------------------------------------
+ (101,1,00101,"Fri Jan 02 00:00:00 1970 PST","Fri Jan 02 00:00:00 1970",1,"1         ",foo)
+ (102,2,00102,"Sat Jan 03 00:00:00 1970 PST","Sat Jan 03 00:00:00 1970",2,"2         ",foo)
+ (103,3,00103,"Sun Jan 04 00:00:00 1970 PST","Sun Jan 04 00:00:00 1970",3,"3         ",foo)
+ (104,4,00104,"Mon Jan 05 00:00:00 1970 PST","Mon Jan 05 00:00:00 1970",4,"4         ",foo)
+ (105,5,00105,"Tue Jan 06 00:00:00 1970 PST","Tue Jan 06 00:00:00 1970",5,"5         ",foo)
+ (106,6,00106,"Wed Jan 07 00:00:00 1970 PST","Wed Jan 07 00:00:00 1970",6,"6         ",foo)
+ (107,7,00107,"Thu Jan 08 00:00:00 1970 PST","Thu Jan 08 00:00:00 1970",7,"7         ",foo)
+ (108,8,00108,"Fri Jan 09 00:00:00 1970 PST","Fri Jan 09 00:00:00 1970",8,"8         ",foo)
+ (109,9,00109,"Sat Jan 10 00:00:00 1970 PST","Sat Jan 10 00:00:00 1970",9,"9         ",foo)
+ (110,0,00110,"Sun Jan 11 00:00:00 1970 PST","Sun Jan 11 00:00:00 1970",0,"0         ",foo)
+(10 rows)
+
 -- empty result
 SELECT * FROM ft1 WHERE false;
  c1 | c2 | c3 | c4 | c5 | c6 | c7 | c8 
index 0fb2b41117c61328f5fb86735398e164e869d2be..8569474694e50b53b27bb936df3fe7b3aceaee9e 100644 (file)
@@ -136,6 +136,9 @@ EXPLAIN (COSTS false) SELECT * FROM ft1 ORDER BY c3, c1 OFFSET 100 LIMIT 10;
 SELECT * FROM ft1 ORDER BY c3, c1 OFFSET 100 LIMIT 10;
 EXPLAIN (VERBOSE, COSTS false) SELECT * FROM ft1 t1 ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10;
 SELECT * FROM ft1 t1 ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10;
+-- whole-row reference
+EXPLAIN (VERBOSE, COSTS false) SELECT t1 FROM ft1 t1 ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10;
+SELECT t1 FROM ft1 t1 ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10;
 -- empty result
 SELECT * FROM ft1 WHERE false;
 -- with WHERE clause