Re: Minor code improvements to create_foreignscan_plan/ExecInitForeignScan

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: Raw Message | Whole Thread | 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

In response to

Responses

Browse pgsql-hackers by date

  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