diff --git a/src/backend/utils/adt/rangetypes.c b/src/backend/utils/adt/rangetypes.c
index 815175a654..9ef9d454d6 100644
--- a/src/backend/utils/adt/rangetypes.c
+++ b/src/backend/utils/adt/rangetypes.c
@@ -183,8 +183,10 @@ range_recv(PG_FUNCTION_ARGS)
 	flags &= (RANGE_EMPTY |
 			  RANGE_LB_INC |
 			  RANGE_LB_INF |
+			  RANGE_LB_NULL |
 			  RANGE_UB_INC |
-			  RANGE_UB_INF);
+			  RANGE_UB_INF |
+			  RANGE_UB_NULL);
 
 	/* receive the bounds ... */
 	if (RANGE_HAS_LBOUND(flags))
@@ -432,13 +434,14 @@ range_lower(PG_FUNCTION_ARGS)
 	RangeBound	lower;
 	RangeBound	upper;
 	bool		empty;
+	char		flags = range_get_flags(r1);
 
 	typcache = range_get_typcache(fcinfo, RangeTypeGetOid(r1));
 
 	range_deserialize(typcache, r1, &lower, &upper, &empty);
 
 	/* Return NULL if there's no finite lower bound */
-	if (empty || lower.infinite)
+	if (!RANGE_HAS_LBOUND(flags))
 		PG_RETURN_NULL();
 
 	PG_RETURN_DATUM(lower.val);
@@ -453,13 +456,14 @@ range_upper(PG_FUNCTION_ARGS)
 	RangeBound	lower;
 	RangeBound	upper;
 	bool		empty;
+	char		flags = range_get_flags(r1);
 
 	typcache = range_get_typcache(fcinfo, RangeTypeGetOid(r1));
 
 	range_deserialize(typcache, r1, &lower, &upper, &empty);
 
 	/* Return NULL if there's no finite upper bound */
-	if (empty || upper.infinite)
+	if (!RANGE_HAS_UBOUND(flags))
 		PG_RETURN_NULL();
 
 	PG_RETURN_DATUM(upper.val);
@@ -1677,7 +1681,7 @@ range_serialize(TypeCacheEntry *typcache, RangeBound *lower, RangeBound *upper,
 	Assert(!upper->lower);
 
 	if (empty)
-		flags |= RANGE_EMPTY;
+		flags |= RANGE_EMPTY | RANGE_LB_NULL | RANGE_UB_NULL;
 	else
 	{
 		cmp = range_cmp_bound_values(typcache, lower, upper);
@@ -2188,7 +2192,7 @@ range_parse(const char *string, char *flags, char **lbound_str,
 	if (pg_strncasecmp(ptr, RANGE_EMPTY_LITERAL,
 					   strlen(RANGE_EMPTY_LITERAL)) == 0)
 	{
-		*flags = RANGE_EMPTY;
+		*flags = RANGE_EMPTY | RANGE_LB_NULL | RANGE_UB_NULL;
 		*lbound_str = NULL;
 		*ubound_str = NULL;
 
diff --git a/src/include/utils/rangetypes.h b/src/include/utils/rangetypes.h
index 04c302c619..b099409048 100644
--- a/src/include/utils/rangetypes.h
+++ b/src/include/utils/rangetypes.h
@@ -40,18 +40,14 @@ typedef struct
 #define RANGE_UB_INC		0x04	/* upper bound is inclusive */
 #define RANGE_LB_INF		0x08	/* lower bound is -infinity */
 #define RANGE_UB_INF		0x10	/* upper bound is +infinity */
-#define RANGE_LB_NULL		0x20	/* lower bound is null (NOT USED) */
-#define RANGE_UB_NULL		0x40	/* upper bound is null (NOT USED) */
+#define RANGE_LB_NULL		0x20	/* lower bound is null */
+#define RANGE_UB_NULL		0x40	/* upper bound is null */
 #define RANGE_CONTAIN_EMPTY 0x80	/* marks a GiST internal-page entry whose
 									 * subtree contains some empty ranges */
 
-#define RANGE_HAS_LBOUND(flags) (!((flags) & (RANGE_EMPTY | \
-											  RANGE_LB_NULL | \
-											  RANGE_LB_INF)))
+#define RANGE_HAS_LBOUND(flags) (!((flags) & (RANGE_LB_NULL | RANGE_LB_INF)))
 
-#define RANGE_HAS_UBOUND(flags) (!((flags) & (RANGE_EMPTY | \
-											  RANGE_UB_NULL | \
-											  RANGE_UB_INF)))
+#define RANGE_HAS_UBOUND(flags) (!((flags) & (RANGE_UB_NULL | RANGE_UB_INF)))
 
 #define RangeIsEmpty(r)  ((range_get_flags(r) & RANGE_EMPTY) != 0)
 #define RangeIsOrContainsEmpty(r)  \
