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) \