On Wed, Feb 22, 2017 at 12:15 PM, Etsuro Fujita <fujita.ets...@lab.ntt.co.jp > wrote:
> On 2017/02/21 19:31, Rushabh Lathia wrote: > >> On Mon, Feb 20, 2017 at 1:41 PM, Etsuro Fujita >> <fujita.ets...@lab.ntt.co.jp <mailto:fujita.ets...@lab.ntt.co.jp>> wrote: >> > > On 2017/02/13 18:24, Rushabh Lathia wrote: >> Here are few comments: >> >> 1) >> >> @@ -211,6 +211,12 @@ typedef struct PgFdwDirectModifyState >> PGresult *result; /* result for query */ >> int num_tuples; /* # of result tuples */ >> int next_tuple; /* index of next one to >> return */ >> + Relation resultRel; /* relcache entry for the >> target table */ >> >> >> Why we need resultRel? Can't we directly use dmstate->rel ? >> >> >> The reason why we need that is because in get_returning_data, we >> pass dmstate->rel to make_tuple_from_result_row, which requires that >> dmstate->rel be NULL when the scan tuple is described by >> fdw_scan_tlist. So in that case we set dmstate->rel to NULL and >> have dmstate->resultRel that is the relcache entry for the target >> relation in postgresBeginDirectModify. >> > > Thanks for the explanation. We might do something here by using >> fdw_scan_tlist or changing the assumption of >> make_tuple_from_result_row(), and that way we can avoid two similar >> variable pointer in the PgFdwDirectModifyState. >> > > I agree that the two similar variables are annoying, to some extent, but > ISTM that is not that bad because that makes the handling of dmstate->rel > consistent with that of PgFdwScanState's rel. As you know, > PgFdwDirectModifyState is defined in a similar way as PgFdwScanState, in > which the rel is a relcache entry for the foreign table for a simple > foreign table scan and NULL for a foreign join scan (see comments for the > definition of PgFdwScanState). > > I am okay with currently also, but it adding a note somewhere about this >> would be great. Also let keep this point open for the committer, if >> committer feel this is good then lets go ahead with this. >> > > Agreed. > > Thanks. Marked this as Ready for Committer. > Here are few other cosmetic changes: >> >> 1) >> >> + * >> + * 'target_rel' is either zero or the rangetable index of a target >> relation. >> + * In the latter case this construncts FROM clause of UPDATE or USING >> clause >> + * of DELETE by simply ignoring the target relation while deparsing the >> given >> >> Spell correction: - construncts >> >> 2) >> >> + /* >> + * If either input is the target relation, get all the >> joinclauses. >> + * Otherwise extract conditions mentioning the target relation >> from >> + * the joinclauses. >> + */ >> >> >> space between joinclauses needed. >> >> 3) >> >> + /* >> + * If UPDATE/DELETE on a join, create a RETURINING list used in >> the >> + * remote query. >> + */ >> + if (fscan->scan.scanrelid == 0) >> + returningList = make_explicit_returning_list(resultRelation, >> + rel, >> + returningList); >> >> >> Spell correction: RETURINING >> > > Good catch! > > I did above changes in the attached patch. Please have a look once and >> > > I'm fine with that. Thanks for the patch! > > then I feel like this patch is ready for committer. >> > > Thanks for reviewing! > > Best regards, > Etsuro Fujita > > > -- Rushabh Lathia