]> granicus.if.org Git - postgresql/commitdiff
Don't test for system columns on join relations
authorAlvaro Herrera <alvherre@alvh.no-ip.org>
Tue, 2 Feb 2016 18:20:02 +0000 (19:20 +0100)
committerAlvaro Herrera <alvherre@alvh.no-ip.org>
Tue, 2 Feb 2016 18:20:02 +0000 (19:20 +0100)
create_foreignscan_plan needs to know whether any system columns are
requested from a relation (this flag is needed by ForeignNext during
execution).  However, for join relations this is a pointless test,
because it's not possible to request system columns from them, so
remove the check.

Author: Etsuro Fujita
Discussion: http://www.postgresql.org/message-id/56AA0FC5.9000207@lab.ntt.co.jp
Reviewed-by: David Rowley, Robert Haas
src/backend/optimizer/plan/createplan.c

index bdac0b1860b5ca2d8e8ba37e65189a6cdebc5747..54ff7f623d45137d396390b4082a29ad3a72bb3b 100644 (file)
@@ -2099,10 +2099,7 @@ create_foreignscan_plan(PlannerInfo *root, ForeignPath *best_path,
        RelOptInfo *rel = best_path->path.parent;
        Index           scan_relid = rel->relid;
        Oid                     rel_oid = InvalidOid;
-       Bitmapset  *attrs_used = NULL;
        Plan       *outer_plan = NULL;
-       ListCell   *lc;
-       int                     i;
 
        Assert(rel->fdwroutine != NULL);
 
@@ -2180,36 +2177,48 @@ create_foreignscan_plan(PlannerInfo *root, ForeignPath *best_path,
        }
 
        /*
-        * Detect whether any system columns are requested from rel.  This is a
-        * bit of a kluge and might go away someday, so we intentionally leave it
-        * out of the API presented to FDWs.
-        *
-        * First, examine all the attributes needed for joins or final output.
-        * Note: we must look at reltargetlist, not the attr_needed data, because
-        * attr_needed isn't computed for inheritance child rels.
+        * If rel is a base relation, detect whether any system columns are
+        * requested from the rel.  (If rel is a join relation, rel->relid will be
+        * 0, but there can be no Var with relid 0 in the reltargetlist or the
+        * restriction clauses, so we skip this in that case.  Note that any such
+        * columns in base relations that were joined are assumed to be contained
+        * in fdw_scan_tlist.)  This is a bit of a kluge and might go away someday,
+        * so we intentionally leave it out of the API presented to FDWs.
         */
-       pull_varattnos((Node *) rel->reltargetlist, rel->relid, &attrs_used);
-
-       /* Add all the attributes used by restriction clauses. */
-       foreach(lc, rel->baserestrictinfo)
+       scan_plan->fsSystemCol = false;
+       if (scan_relid > 0)
        {
-               RestrictInfo *rinfo = (RestrictInfo *) lfirst(lc);
+               Bitmapset  *attrs_used = NULL;
+               ListCell   *lc;
+               int                     i;
 
-               pull_varattnos((Node *) rinfo->clause, rel->relid, &attrs_used);
-       }
+               /*
+                * First, examine all the attributes needed for joins or final output.
+                * Note: we must look at reltargetlist, not the attr_needed data,
+                * because attr_needed isn't computed for inheritance child rels.
+                */
+               pull_varattnos((Node *) rel->reltargetlist, scan_relid, &attrs_used);
 
-       /* Now, are any system columns requested from rel? */
-       scan_plan->fsSystemCol = false;
-       for (i = FirstLowInvalidHeapAttributeNumber + 1; i < 0; i++)
-       {
-               if (bms_is_member(i - FirstLowInvalidHeapAttributeNumber, attrs_used))
+               /* Add all the attributes used by restriction clauses. */
+               foreach(lc, rel->baserestrictinfo)
                {
-                       scan_plan->fsSystemCol = true;
-                       break;
+                       RestrictInfo *rinfo = (RestrictInfo *) lfirst(lc);
+
+                       pull_varattnos((Node *) rinfo->clause, scan_relid, &attrs_used);
                }
-       }
 
-       bms_free(attrs_used);
+               /* Now, are any system columns requested from rel? */
+               for (i = FirstLowInvalidHeapAttributeNumber + 1; i < 0; i++)
+               {
+                       if (bms_is_member(i - FirstLowInvalidHeapAttributeNumber, attrs_used))
+                       {
+                               scan_plan->fsSystemCol = true;
+                               break;
+                       }
+               }
+
+               bms_free(attrs_used);
+       }
 
        return scan_plan;
 }