On 2016/02/04 21:42, Ashutosh Bapat wrote:

    * Is it safe to replace outerjoinpath with its fdw_outerpath the
    following way?  I think that if the join relation represented by
    outerjoinpath has local conditions that can't be executed remotely,
    we have to keep outerjoinpath in the path tree; we will otherwise
    fail to execute the local conditions.  No?

    +                       /*
    +                        * If either inner or outer path is a
    ForeignPath corresponding to
    +                        * a pushed down join, replace it with the
    fdw_outerpath, so that we
    +                        * maintain path for EPQ checks built
    entirely of local join
    +                        * strategies.
    +                        */
    +                       if (IsA(joinpath->outerjoinpath, ForeignPath))
    +                       {
    +                               ForeignPath *foreign_path;
    +                               foreign_path = (ForeignPath
    *)joinpath->outerjoinpath;
    +                               if
    (foreign_path->path.parent->reloptkind == RELOPT_JOINREL)
    +                                       joinpath->outerjoinpath =
    foreign_path->fdw_outerpath;
    +                       }

all the conditions (local and remote) should be part of fdw_outerpath as
well, since that's the alternate local path, which should produce (when
converted to the plan) the same result as the foreign path.
fdw_outerpath should be a local path set when paths for
outerjoinpath->parent was being created. Am I missing something?

I assumed by mistake that only the remote conditions were evaluated in a plan created from each fdw_outerpath. Sorry for that. I think that is a good idea!

Btw, IIUC, I think the patch fails to adjust the targetlist of the top plan created that way, to output the fdw_scan_tlist, as discussed in [1] (ie, I think the attached patch is needed, which is created on top of your patch pg_fdw_join_v8.patch).

Best regards,
Etsuro Fujita

[1] http://www.postgresql.org/message-id/ca+tgmoba4mskgquicgt5ckbpqj-tmpqefht_wy49ndwa91w...@mail.gmail.com
*** a/contrib/postgres_fdw/postgres_fdw.c
--- b/contrib/postgres_fdw/postgres_fdw.c
***************
*** 1067,1072 **** postgresGetForeignPlan(PlannerInfo *root,
--- 1067,1076 ----
  
  		/* Build the list of columns to be fetched from the foreign server. */
  		fdw_scan_tlist = build_tlist_to_deparse(foreignrel);
+ 
+ 		/* Replace the targetlist of outer_plan with fdw_scan_tlist, if any */
+ 		if (outer_plan)
+ 			outer_plan->targetlist = fdw_scan_tlist;
  	}
  
  	/*
-- 
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