Re: Push down more UPDATEs/DELETEs in postgres_fdw - Mailing list pgsql-hackers
From | Etsuro Fujita |
---|---|
Subject | Re: Push down more UPDATEs/DELETEs in postgres_fdw |
Date | |
Msg-id | e05ee68c-4208-69fc-5883-054ba5e69fe7@lab.ntt.co.jp Whole thread Raw |
In response to | Re: Push down more UPDATEs/DELETEs in postgres_fdw (Rushabh Lathia <rushabh.lathia@gmail.com>) |
Responses |
Re: Push down more UPDATEs/DELETEs in postgres_fdw
|
List | pgsql-hackers |
Hi Rushabh, On 2016/11/22 19:05, Rushabh Lathia wrote: > I started reviewing the patch and here are few initial review points and > questions for you. Thanks for the review! > 1) > -static void deparseExplicitTargetList(List *tlist, List **retrieved_attrs, > +static void deparseExplicitTargetList(bool is_returning, > + List *tlist, > + List **retrieved_attrs, > deparse_expr_cxt *context); > > Any particular reason of inserting new argument as 1st argunment? In general > we add new flags at the end or before the out param for the existing > function. No, I don't. I think the *context should be the last argument as in other functions in deparse.c. How about inserting that before the out param **retrieved_attrs, like this? static void deparseExplicitTargetList(List *tlist, bool is_returning, List **retrieved_attrs, deparse_expr_cxt *context); > 2) > -static void deparseFromExprForRel(StringInfo buf, PlannerInfo *root, > - RelOptInfo *joinrel, bool use_alias, List > **params_list); > +static void deparseFromExprForRel(StringInfo buf, PlannerInfo *root, > RelOptInfo *foreignrel, > + bool use_alias, Index target_rel, List > **params_list); > Going beyond 80 character length Will fix. > 3) > static void > -deparseExplicitTargetList(List *tlist, List **retrieved_attrs, > +deparseExplicitTargetList(bool is_returning, > + List *tlist, > + List **retrieved_attrs, > deparse_expr_cxt *context) > > This looks bit wired to me - as comment for the deparseExplicitTargetList() > function name and comments says different then what its trying to do when > is_returning flag is passed. Either function comment need to be change or > may be separate function fo deparse returning list for join relation? > > Is it possible to teach deparseReturningList() to deparse the returning > list for the joinrel? I don't think it's possible to do that because deparseReturningList uses deparseTargetList internally, which only allows us to emit a target list for a baserel. For example, deparseReturningList can't handle a returning list that contains join outputs like this: postgres=# explain verbose delete from ft1 using ft2 where ft1.a = ft2.a returning ft1.*, ft2.*; QUERY PLAN ------------------------------------------------------------------------------------------------------------------------ Deleteon public.ft1 (cost=100.00..102.06 rows=1 width=46) Output: ft1.a, ft1.b, ft2.a, ft2.b -> Foreign Delete (cost=100.00..102.06rows=1 width=46) Remote SQL: DELETE FROM public.t1 r1 USING public.t2 r2 WHERE ((r1.a = r2.a)) RETURNING r1.a, r1.b, r2.a, r2.b (4 rows) I'd like to change the comment for deparseExplicitTargetList. > 4) > > + if (foreignrel->reloptkind == RELOPT_JOINREL) > + { > + List *rlist = NIL; > + > + /* Create a RETURNING list */ > + rlist = make_explicit_returning_list(rtindex, rel, > + returningList, > + fdw_scan_tlist); > + > + deparseExplicitReturningList(rlist, retrieved_attrs, &context); > + } > + else > + deparseReturningList(buf, root, rtindex, rel, false, > + returningList, retrieved_attrs); > > The code will be more centralized if we add the logic of extracting > returninglist > for JOINREL inside deparseReturningList() only, isn't it? You are right. Will do. > 5) make_explicit_returning_list() pull the var list from the > returningList and > build the targetentry for the returning list and at the end rewrites the > fdw_scan_tlist. > > AFAIK, in case of DML - which is going to pushdown to the remote server > ideally fdw_scan_tlist should be same as returning list, as final output > for the query is query will be RETUNING list only. isn't that true? That would be true. But the fdw_scan_tlist passed from the core would contain junk columns inserted by the rewriter and planner work, such as CTID for the target table and whole-row Vars for other tables specified in the FROM clause of an UPDATE or the USING clause of a DELETE. So, I created the patch so that the pushed-down UPDATE/DELETE retrieves only the data needed for the RETURNING calculation from the remote server, not the whole fdw_scan_tlist data. > If yes, then why can't we directly replace the fdw_scan_tlist with the > returning > list, rather then make_explicit_returning_list()? I think we could do that if we modified the core (maybe the executor part). I'm not sure that's a good idea, though. > Also I think rewriting the fdw_scan_tlist should happen into > postgres_fdw.c - > rather then deparse.c. Will try. > 6) Test coverage for the returning list is missing. Will add. Best regards, Etsuro Fujita
pgsql-hackers by date: