summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane2011-11-14 20:34:39 +0000
committerTom Lane2011-11-14 20:34:39 +0000
commit4f9e33063cea270166fba12d89fe49876f814398 (patch)
treee47b774c64242ae1b1e6c864aec2adabd2cf511d
parent851c83fc81917c61b063c875fc1bca489dfcc482 (diff)
Return NULL instead of throwing error when desired bound is not available.
Change range_lower and range_upper to return NULL rather than throwing an error when the input range is empty or the relevant bound is infinite. Per discussion, throwing an error seems likely to be unduly hard to work with. Also, this is more consistent with the behavior of the constructors, which treat NULL as meaning an infinite bound.
-rw-r--r--doc/src/sgml/func.sgml8
-rw-r--r--src/backend/utils/adt/rangetypes.c22
2 files changed, 14 insertions, 16 deletions
diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml
index b9ef827984..a7dc05bf38 100644
--- a/doc/src/sgml/func.sgml
+++ b/doc/src/sgml/func.sgml
@@ -10745,6 +10745,14 @@ SELECT NULLIF(value, '(none)') ...
</tbody>
</tgroup>
</table>
+
+ <para>
+ The <function>lower</> and <function>upper</> functions return null
+ if the range is empty or the requested bound is infinite.
+ The <function>lower_inc</function>, <function>upper_inc</function>,
+ <function>lower_inf</function>, and <function>upper_inf</function>
+ functions all return false for an empty range.
+ </para>
</sect1>
<sect1 id="functions-aggregate">
diff --git a/src/backend/utils/adt/rangetypes.c b/src/backend/utils/adt/rangetypes.c
index 5c16ca1b19..de9b9a5efb 100644
--- a/src/backend/utils/adt/rangetypes.c
+++ b/src/backend/utils/adt/rangetypes.c
@@ -456,14 +456,9 @@ range_lower(PG_FUNCTION_ARGS)
range_deserialize(fcinfo, r1, &lower, &upper, &empty);
- if (empty)
- ereport(ERROR,
- (errcode(ERRCODE_DATA_EXCEPTION),
- errmsg("empty range has no lower bound")));
- if (lower.infinite)
- ereport(ERROR,
- (errcode(ERRCODE_DATA_EXCEPTION),
- errmsg("range lower bound is infinite")));
+ /* Return NULL if there's no finite lower bound */
+ if (empty || lower.infinite)
+ PG_RETURN_NULL();
PG_RETURN_DATUM(lower.val);
}
@@ -478,14 +473,9 @@ range_upper(PG_FUNCTION_ARGS)
range_deserialize(fcinfo, r1, &lower, &upper, &empty);
- if (empty)
- ereport(ERROR,
- (errcode(ERRCODE_DATA_EXCEPTION),
- errmsg("empty range has no upper bound")));
- if (upper.infinite)
- ereport(ERROR,
- (errcode(ERRCODE_DATA_EXCEPTION),
- errmsg("range upper bound is infinite")));
+ /* Return NULL if there's no finite upper bound */
+ if (empty || upper.infinite)
+ PG_RETURN_NULL();
PG_RETURN_DATUM(upper.val);
}