One thing I noticed while re-reading the patch is that we should use create_projection_path() here, to avoid modifying the epq_path in place, as it is already used for an unsorted join-pushdown path before we get here. So I modified the patch as such. Updated patch attached.
The new change looks reasonable to me as there is other ref to this epq_path.
I'm looking again on how we adjust the PathTarget, and I think we may need to update the cost and width fields if there are any new columns added. Maybe we can leverage set_pathtarget_cost_width for that.