They're very limited compared to what you'd get in a real programming language. The fact that the language needs to define types for so many things is actually a demonstration of this - the reason postgres has built-in types for things like IP addresses or line segments is because it's too hard for users to implement such things themselves and very little notion of library code.