| From: | Alvaro Herrera <alvherre(at)2ndquadrant(dot)com> | 
|---|---|
| To: | Etsuro Fujita <fujita(dot)etsuro(at)lab(dot)ntt(dot)co(dot)jp> | 
| Cc: | Robert Haas <robertmhaas(at)gmail(dot)com>, Michael Paquier <michael(dot)paquier(at)gmail(dot)com>, PostgreSQL mailing lists <pgsql-hackers(at)postgresql(dot)org> | 
| Subject: | Re: Minor code improvements to create_foreignscan_plan/ExecInitForeignScan | 
| Date: | 2016-01-11 17:36:27 | 
| Message-ID: | 20160111173627.GA734623@alvherre.pgsql | 
| Views: | Whole Thread | Raw Message | Download mbox | Resend email | 
| Thread: | |
| Lists: | pgsql-hackers | 
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.
-- 
Álvaro Herrera                http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
| From | Date | Subject | |
|---|---|---|---|
| Next Message | Tom Lane | 2016-01-11 17:51:45 | Re: Making plpython 2 and 3 coexist a bit better | 
| Previous Message | Atri Sharma | 2016-01-11 17:19:28 | Re: Accessing non catalog table in backend |