On 2016/01/12 18:00, Etsuro Fujita wrote:
On 2016/01/12 2:36, Alvaro Herrera wrote:
I wonder,

--- 2166,2213 ----
       }

       /*
!      * 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 in the target list with relid 0,
so we skip
!      * this in that case.  Note that any such system columns are
assumed to be
!      * contained in fdw_scan_tlist, so we never need fsSystemCol to
be true in
!      * the joinrel case.)  This is a bit of a kluge and might go
away someday,
!      * so we intentionally leave it out of the API presented to FDWs.
        */
!     scan_plan->fsSystemCol = false;
!     if (scan_relid > 0)
       {
!         Bitmapset  *attrs_used = NULL;
!         ListCell   *lc;
!         int            i;

!         /*
!          * 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);

!         /* Add all the attributes used by restriction clauses. */
!         foreach(lc, rel->baserestrictinfo)
           {
!             RestrictInfo *rinfo = (RestrictInfo *) lfirst(lc);
!
!             pull_varattnos((Node *) rinfo->clause, scan_relid,
&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;
   }

Would it make sense to call pull_varattnos(reltargetlist), then walk the
bitmapset and break if we see a system column, then call
pull_varattnos() on the rinfo->clause?  That way, if the targetlist
request a system column we don't have to walk the RestrictInfos.

Seems like a good idea.  Will update the patch.

Done.  Attached is an updated version of the patch.

Best regards,
Etsuro Fujita
*** a/src/backend/optimizer/plan/createplan.c
--- b/src/backend/optimizer/plan/createplan.c
***************
*** 2097,2106 **** 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);
  
--- 2097,2103 ----
***************
*** 2169,2204 **** 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.
  	 */
! 	pull_varattnos((Node *) rel->reltargetlist, rel->relid, &attrs_used);
! 
! 	/* Add all the attributes used by restriction clauses. */
! 	foreach(lc, rel->baserestrictinfo)
  	{
! 		RestrictInfo *rinfo = (RestrictInfo *) lfirst(lc);
  
! 		pull_varattnos((Node *) rinfo->clause, rel->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))
  		{
! 			scan_plan->fsSystemCol = true;
! 			break;
  		}
- 	}
  
! 	bms_free(attrs_used);
  
  	return scan_plan;
  }
--- 2166,2229 ----
  	}
  
  	/*
! 	 * 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.
  	 */
! 	scan_plan->fsSystemCol = false;
! 	if (scan_relid > 0)
  	{
! 		Bitmapset  *attrs_used = NULL;
! 		ListCell   *lc;
! 		int			i;
  
! 		/*
! 		 * 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);
  
! 		/* 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;
! 			}
  		}
  
! 		/* Examine all the attributes used by restriction clauses, if needed */
! 		if (!scan_plan->fsSystemCol)
! 		{
! 			foreach(lc, rel->baserestrictinfo)
! 			{
! 				RestrictInfo *rinfo = (RestrictInfo *) lfirst(lc);
! 
! 				pull_varattnos((Node *) rinfo->clause, scan_relid, &attrs_used);
! 
! 				/* 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;
! 					}
! 				}
! 
! 				if (scan_plan->fsSystemCol)
! 					break;
! 			}
! 		}
! 
! 		bms_free(attrs_used);
! 	}
  
  	return scan_plan;
  }
-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to