I haven't been keeping close tabs either, but surely we still have to have the optimization fence in (at least) all these cases:
* CTE contains INSERT/UPDATE/DELETE * CTE contains SELECT FOR UPDATE/SHARE (else the set of rows that get locked might change) * CTE contains volatile functions
I'm willing to write off cases where, eg, a function should have been marked volatile and was not. That's user error and there are plenty of hazards of that kind already. But if the optimizer has reason to know that discarding the fence might change any query side-effects, it mustn't.