Ok, I'll update the patch. One thing I'd like to revise in addition to that is (1) add to JoinPathExtraData a flag member to indicate whether to give the FDW a chance to consider a remote join, which will be set to true if the joinrel's fdwroutine is not NULL and the fdwroutine's GetForeignJoinPaths is not NULL, and (2) if the flag is true, save info to create an alternative local join path, such as hashclauses and mergeclauses proposed in the patch, into JoinPathExtraData in add_paths_to_joinrel. This would avoid useless overhead in saving such info into JoinPathExtraData when we don't give the FDW that chance.
Done. Attached is a new version of the patch.
Is the fix for 9.6.3 going to be just a back port of this, or will it look different?