I have seen quite many broken home-rolled UPSERT implementations, so it is apparently not that easy to get it right. Still not very hard though once you have understood the potential problems involved.
In OSS communities it's a serious problem. At work, it was routine: this is yet another thing that can be more easily screwed up if you don't use a library solution we've provided you.