Thanks everyone. I understand now. The funny thing is I read the documentation many weeks before actually using range types for the first time but it didn't click that the documentation was describing the behavior I was observing, until now.
see that the '[]] has been changed to '[)' with tomorrows date as the upper bound.
#1 & #2 are FALSE because upper returns 5 instead of 4; and #5 is FALSE because upper returns: current_date + interval '1 day'. I don't understand the logic behind why it would return the inclusive upper bound value for some ranges and not others. If anyone can shed some light on this behavior it would be greatly appreciated.
One of things I originally tried to use upper for was CHECK constraints. That was until I wrote some unit tests and realized that upper doesn't consistently work the way I expected. Of course my assumptions are probably wrong so that's why I'm asking for clarification.