@ -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 rel s.
* 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 FDW s.
*/
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 ;
}