I've tracked this down to a regression in the patch I wrote for bug 1721807 - see commit 88bdd77b97a. Upshot is that the special logic to use the primary key of the left side of the join should be done only if the field is virtual; otherwise, p.uplink.name should be used instead.
I suspect this has been less of an issue for stock reporting sources than one might expect because most of the has_many and might_have linking fields are virtual. (And nullability provides an escape valve when you're sure you want a left or right join.)
I've tracked this down to a regression in the patch I wrote for bug 1721807 - see commit 88bdd77b97a. Upshot is that the special logic to use the primary key of the left side of the join should be done only if the field is virtual; otherwise, p.uplink.name should be used instead.
I suspect this has been less of an issue for stock reporting sources than one might expect because most of the has_many and might_have linking fields are virtual. (And nullability provides an escape valve when you're sure you want a left or right join.)