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.
Alot of the difficulty was explaining to others that there wasn't an easy way to upsert, and trying to ensure everyone did it the proper way.
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.