Don't test for system columns on join relations
authorAlvaro Herrera
Tue, 2 Feb 2016 18:20:02 +0000 (19:20 +0100)
committerAlvaro Herrera
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;
 }