I think we should fix to_date() to throw an error. Personally I would be happy if my code broke due to this kind of change since the exception would reveal an old bug which has been there a long time eating my data. I cannot see a case where I would have wanted the current behavior.
If I remember, this implementation is based on Oracle's behave. It is pretty old and documented - so it is hard to speak about it like the bug. I understand, so the behave is strange, but it was designed in different time. You can enter not 100% valid string, but you get correct date
It can be used for some date calculations. In old age the applications was designed in this style. I am against to change of default behave. We can introduce new new different function with different name with better designed format and rules, or we can add new options to this function, or we can live with current state.
Now, to_date function should not be used - functions make_date, make_timestamp are faster and safe.
postgres=# select make_date(2017,01,40); ERROR: date field value out of range: 2017-01-40
Regards
Pavel
If there is any legitimate use for the current behavior then we can add it back as another function.