type. Using the constructor function is frequently more convenient than
writing a range literal constant, since it avoids the need for extra
quoting of the bound values. The constructor function
- accepts from zero to three arguments. The zero-argument form
- constructs an empty range; the one-argument form constructs a
- singleton range; the two-argument form constructs a range in
- standard form (lower bound inclusive, upper bound exclusive);
- and the three-argument form constructs a range in a form specified by the
- third argument. The third argument must be one of the strings
+ accepts two or three arguments. The two-argument form constructs a range
+ in standard form (lower bound inclusive, upper bound exclusive), while
+ the three-argument form constructs a range with bounds of the form
+ specified by the third argument.
+ The third argument must be one of the strings
<quote><literal>()</literal></quote>,
<quote><literal>(]</literal></quote>,
<quote><literal>[)</literal></quote>, or
For example:
<programlisting>
--- Three-argument form: lower bound, upper bound, and third argument indicating
+-- The full form is: lower bound, upper bound, and text argument indicating
-- inclusivity/exclusivity of bounds.
SELECT numrange(1.0, 14.0, '(]');
-- Using NULL for either bound causes the range to be unbounded on that side.
SELECT numrange(NULL, 2.2);
-
--- Single argument constructs a singleton range; that is a range consisting of
--- just one point.
-SELECT numrange(11.1);
-
--- Zero-argument form constructs an empty range.
-SELECT numrange();
</programlisting>
</para>
</sect2>
makeRangeConstructors(const char *name, Oid namespace,
Oid rangeOid, Oid subtype)
{
- static const char * const prosrc[4] = {"range_constructor0",
- "range_constructor1",
- "range_constructor2",
+ static const char * const prosrc[2] = {"range_constructor2",
"range_constructor3"};
- static const int pronargs[4] = {0, 1, 2, 3};
+ static const int pronargs[2] = {2, 3};
Oid constructorArgTypes[3];
ObjectAddress myself,
*----------------------------------------------------------
*/
-/* Construct empty range value from no arguments */
-Datum
-range_constructor0(PG_FUNCTION_ARGS)
-{
- Oid rngtypid = get_fn_expr_rettype(fcinfo->flinfo);
- RangeType *range;
- TypeCacheEntry *typcache;
-
- typcache = range_get_typcache(fcinfo, rngtypid);
-
- range = make_empty_range(typcache);
-
- PG_RETURN_RANGE(range);
-}
-
-/* Construct singleton range value from one argument */
-Datum
-range_constructor1(PG_FUNCTION_ARGS)
-{
- Datum arg1 = PG_GETARG_DATUM(0);
- Oid rngtypid = get_fn_expr_rettype(fcinfo->flinfo);
- RangeType *range;
- TypeCacheEntry *typcache;
-
- typcache = range_get_typcache(fcinfo, rngtypid);
-
- if (PG_ARGISNULL(0))
- ereport(ERROR,
- (errcode(ERRCODE_DATA_EXCEPTION),
- errmsg("range constructor argument must not be NULL")));
-
- range = make_singleton_range(typcache, arg1);
-
- PG_RETURN_RANGE(range);
-}
-
/* Construct standard-form range value from two arguments */
Datum
range_constructor2(PG_FUNCTION_ARGS)
return make_range(typcache, &lower, &upper, true);
}
-/*
- * Build a range value representing a single point.
- */
-RangeType *
-make_singleton_range(TypeCacheEntry *typcache, Datum val)
-{
- RangeBound lower;
- RangeBound upper;
-
- lower.val = val;
- lower.infinite = false;
- lower.inclusive = true;
- lower.lower = true;
-
- upper.val = val;
- upper.infinite = false;
- upper.inclusive = true;
- upper.lower = false;
-
- return make_range(typcache, &lower, &upper, false);
-}
-
/*
*----------------------------------------------------------
*/
/* yyyymmddN */
-#define CATALOG_VERSION_NO 201111221
+#define CATALOG_VERSION_NO 201111222
#endif
DATA(insert OID = 3930 ( tstzrange_subdiff PGNSP PGUID 12 1 0 0 0 f f f t f i 2 0 701 "1184 1184" _null_ _null_ _null_ _null_ tstzrange_subdiff _null_ _null_ _null_ ));
DESCR("float8 difference of two timestamp with time zone values");
-DATA(insert OID = 3838 ( int4range PGNSP PGUID 12 1 0 0 0 f f f f f i 0 0 3904 "" _null_ _null_ _null_ _null_ range_constructor0 _null_ _null_ _null_ ));
-DESCR("int4range constructor");
-DATA(insert OID = 3839 ( int4range PGNSP PGUID 12 1 0 0 0 f f f f f i 1 0 3904 "23" _null_ _null_ _null_ _null_ range_constructor1 _null_ _null_ _null_ ));
-DESCR("int4range constructor");
DATA(insert OID = 3840 ( int4range PGNSP PGUID 12 1 0 0 0 f f f f f i 2 0 3904 "23 23" _null_ _null_ _null_ _null_ range_constructor2 _null_ _null_ _null_ ));
DESCR("int4range constructor");
DATA(insert OID = 3841 ( int4range PGNSP PGUID 12 1 0 0 0 f f f f f i 3 0 3904 "23 23 25" _null_ _null_ _null_ _null_ range_constructor3 _null_ _null_ _null_ ));
DESCR("int4range constructor");
-DATA(insert OID = 3842 ( numrange PGNSP PGUID 12 1 0 0 0 f f f f f i 0 0 3906 "" _null_ _null_ _null_ _null_ range_constructor0 _null_ _null_ _null_ ));
-DESCR("numrange constructor");
-DATA(insert OID = 3843 ( numrange PGNSP PGUID 12 1 0 0 0 f f f f f i 1 0 3906 "1700" _null_ _null_ _null_ _null_ range_constructor1 _null_ _null_ _null_ ));
-DESCR("numrange constructor");
DATA(insert OID = 3844 ( numrange PGNSP PGUID 12 1 0 0 0 f f f f f i 2 0 3906 "1700 1700" _null_ _null_ _null_ _null_ range_constructor2 _null_ _null_ _null_ ));
DESCR("numrange constructor");
DATA(insert OID = 3845 ( numrange PGNSP PGUID 12 1 0 0 0 f f f f f i 3 0 3906 "1700 1700 25" _null_ _null_ _null_ _null_ range_constructor3 _null_ _null_ _null_ ));
DESCR("numrange constructor");
-DATA(insert OID = 3846 ( tsrange PGNSP PGUID 12 1 0 0 0 f f f f f i 0 0 3908 "" _null_ _null_ _null_ _null_ range_constructor0 _null_ _null_ _null_ ));
-DESCR("tsrange constructor");
-DATA(insert OID = 3847 ( tsrange PGNSP PGUID 12 1 0 0 0 f f f f f i 1 0 3908 "1114" _null_ _null_ _null_ _null_ range_constructor1 _null_ _null_ _null_ ));
-DESCR("tsrange constructor");
DATA(insert OID = 3933 ( tsrange PGNSP PGUID 12 1 0 0 0 f f f f f i 2 0 3908 "1114 1114" _null_ _null_ _null_ _null_ range_constructor2 _null_ _null_ _null_ ));
DESCR("tsrange constructor");
DATA(insert OID = 3934 ( tsrange PGNSP PGUID 12 1 0 0 0 f f f f f i 3 0 3908 "1114 1114 25" _null_ _null_ _null_ _null_ range_constructor3 _null_ _null_ _null_ ));
DESCR("tsrange constructor");
-DATA(insert OID = 3935 ( tstzrange PGNSP PGUID 12 1 0 0 0 f f f f f i 0 0 3910 "" _null_ _null_ _null_ _null_ range_constructor0 _null_ _null_ _null_ ));
-DESCR("tstzrange constructor");
-DATA(insert OID = 3936 ( tstzrange PGNSP PGUID 12 1 0 0 0 f f f f f i 1 0 3910 "1184" _null_ _null_ _null_ _null_ range_constructor1 _null_ _null_ _null_ ));
-DESCR("tstzrange constructor");
DATA(insert OID = 3937 ( tstzrange PGNSP PGUID 12 1 0 0 0 f f f f f i 2 0 3910 "1184 1184" _null_ _null_ _null_ _null_ range_constructor2 _null_ _null_ _null_ ));
DESCR("tstzrange constructor");
DATA(insert OID = 3938 ( tstzrange PGNSP PGUID 12 1 0 0 0 f f f f f i 3 0 3910 "1184 1184 25" _null_ _null_ _null_ _null_ range_constructor3 _null_ _null_ _null_ ));
DESCR("tstzrange constructor");
-DATA(insert OID = 3939 ( daterange PGNSP PGUID 12 1 0 0 0 f f f f f i 0 0 3912 "" _null_ _null_ _null_ _null_ range_constructor0 _null_ _null_ _null_ ));
-DESCR("daterange constructor");
-DATA(insert OID = 3940 ( daterange PGNSP PGUID 12 1 0 0 0 f f f f f i 1 0 3912 "1082" _null_ _null_ _null_ _null_ range_constructor1 _null_ _null_ _null_ ));
-DESCR("daterange constructor");
DATA(insert OID = 3941 ( daterange PGNSP PGUID 12 1 0 0 0 f f f f f i 2 0 3912 "1082 1082" _null_ _null_ _null_ _null_ range_constructor2 _null_ _null_ _null_ ));
DESCR("daterange constructor");
DATA(insert OID = 3942 ( daterange PGNSP PGUID 12 1 0 0 0 f f f f f i 3 0 3912 "1082 1082 25" _null_ _null_ _null_ _null_ range_constructor3 _null_ _null_ _null_ ));
DESCR("daterange constructor");
-DATA(insert OID = 3943 ( int8range PGNSP PGUID 12 1 0 0 0 f f f f f i 0 0 3926 "" _null_ _null_ _null_ _null_ range_constructor0 _null_ _null_ _null_ ));
-DESCR("int8range constructor");
-DATA(insert OID = 3944 ( int8range PGNSP PGUID 12 1 0 0 0 f f f f f i 1 0 3926 "20" _null_ _null_ _null_ _null_ range_constructor1 _null_ _null_ _null_ ));
-DESCR("int8range constructor");
DATA(insert OID = 3945 ( int8range PGNSP PGUID 12 1 0 0 0 f f f f f i 2 0 3926 "20 20" _null_ _null_ _null_ _null_ range_constructor2 _null_ _null_ _null_ ));
DESCR("int8range constructor");
DATA(insert OID = 3946 ( int8range PGNSP PGUID 12 1 0 0 0 f f f f f i 3 0 3926 "20 20 25" _null_ _null_ _null_ _null_ range_constructor3 _null_ _null_ _null_ ));
extern Datum range_send(PG_FUNCTION_ARGS);
/* constructors */
-extern Datum range_constructor0(PG_FUNCTION_ARGS);
-extern Datum range_constructor1(PG_FUNCTION_ARGS);
extern Datum range_constructor2(PG_FUNCTION_ARGS);
extern Datum range_constructor3(PG_FUNCTION_ARGS);
extern int range_cmp_bound_values(TypeCacheEntry *typcache, RangeBound *b1,
RangeBound *b2);
extern RangeType *make_empty_range(TypeCacheEntry *typcache);
-extern RangeType *make_singleton_range(TypeCacheEntry *typcache, Datum val);
/* GiST support (in rangetypes_gist.c) */
extern Datum range_gist_consistent(PG_FUNCTION_ARGS);
INSERT INTO numrange_test VALUES('[, 5)');
INSERT INTO numrange_test VALUES(numrange(1.1, 2.2));
INSERT INTO numrange_test VALUES('empty');
-INSERT INTO numrange_test VALUES(numrange(1.7));
+INSERT INTO numrange_test VALUES(numrange(1.7, 1.7, '[]'));
SELECT nr, isempty(nr), lower(nr), upper(nr) FROM numrange_test;
nr | isempty | lower | upper
-----------+---------+-------+-------
NOTICE: CREATE TABLE / EXCLUDE will create implicit index "test_range_excl_room_during_excl" for table "test_range_excl"
NOTICE: CREATE TABLE / EXCLUDE will create implicit index "test_range_excl_speaker_during_excl" for table "test_range_excl"
insert into test_range_excl
- values(int4range(123), int4range(1), '[2010-01-02 10:00, 2010-01-02 11:00)');
+ values(int4range(123, 123, '[]'), int4range(1, 1, '[]'), '[2010-01-02 10:00, 2010-01-02 11:00)');
insert into test_range_excl
- values(int4range(123), int4range(2), '[2010-01-02 11:00, 2010-01-02 12:00)');
+ values(int4range(123, 123, '[]'), int4range(2, 2, '[]'), '[2010-01-02 11:00, 2010-01-02 12:00)');
insert into test_range_excl
- values(int4range(123), int4range(3), '[2010-01-02 10:10, 2010-01-02 11:00)');
+ values(int4range(123, 123, '[]'), int4range(3, 3, '[]'), '[2010-01-02 10:10, 2010-01-02 11:00)');
ERROR: conflicting key value violates exclusion constraint "test_range_excl_room_during_excl"
DETAIL: Key (room, during)=([123,124), ["Sat Jan 02 10:10:00 2010","Sat Jan 02 11:00:00 2010")) conflicts with existing key (room, during)=([123,124), ["Sat Jan 02 10:00:00 2010","Sat Jan 02 11:00:00 2010")).
insert into test_range_excl
- values(int4range(124), int4range(3), '[2010-01-02 10:10, 2010-01-02 11:10)');
+ values(int4range(124, 124, '[]'), int4range(3, 3, '[]'), '[2010-01-02 10:10, 2010-01-02 11:10)');
insert into test_range_excl
- values(int4range(125), int4range(1), '[2010-01-02 10:10, 2010-01-02 11:00)');
+ values(int4range(125, 125, '[]'), int4range(1, 1, '[]'), '[2010-01-02 10:10, 2010-01-02 11:00)');
ERROR: conflicting key value violates exclusion constraint "test_range_excl_speaker_during_excl"
DETAIL: Key (speaker, during)=([1,2), ["Sat Jan 02 10:10:00 2010","Sat Jan 02 11:00:00 2010")) conflicts with existing key (speaker, during)=([1,2), ["Sat Jan 02 10:00:00 2010","Sat Jan 02 11:00:00 2010")).
-- test bigint ranges
--
-- Arrays of ranges
--
-select ARRAY[numrange(1.1), numrange(12.3,155.5)];
+select ARRAY[numrange(1.1, 1.2), numrange(12.3, 155.5)];
array
------------------------------
- {"[1.1,1.1]","[12.3,155.5)"}
+ {"[1.1,1.2)","[12.3,155.5)"}
(1 row)
create table i8r_array (f1 int, f2 int8range[]);
INSERT INTO numrange_test VALUES('[, 5)');
INSERT INTO numrange_test VALUES(numrange(1.1, 2.2));
INSERT INTO numrange_test VALUES('empty');
-INSERT INTO numrange_test VALUES(numrange(1.7));
+INSERT INTO numrange_test VALUES(numrange(1.7, 1.7, '[]'));
SELECT nr, isempty(nr), lower(nr), upper(nr) FROM numrange_test;
SELECT nr, lower_inc(nr), lower_inf(nr), upper_inc(nr), upper_inf(nr) FROM numrange_test;
);
insert into test_range_excl
- values(int4range(123), int4range(1), '[2010-01-02 10:00, 2010-01-02 11:00)');
+ values(int4range(123, 123, '[]'), int4range(1, 1, '[]'), '[2010-01-02 10:00, 2010-01-02 11:00)');
insert into test_range_excl
- values(int4range(123), int4range(2), '[2010-01-02 11:00, 2010-01-02 12:00)');
+ values(int4range(123, 123, '[]'), int4range(2, 2, '[]'), '[2010-01-02 11:00, 2010-01-02 12:00)');
insert into test_range_excl
- values(int4range(123), int4range(3), '[2010-01-02 10:10, 2010-01-02 11:00)');
+ values(int4range(123, 123, '[]'), int4range(3, 3, '[]'), '[2010-01-02 10:10, 2010-01-02 11:00)');
insert into test_range_excl
- values(int4range(124), int4range(3), '[2010-01-02 10:10, 2010-01-02 11:10)');
+ values(int4range(124, 124, '[]'), int4range(3, 3, '[]'), '[2010-01-02 10:10, 2010-01-02 11:10)');
insert into test_range_excl
- values(int4range(125), int4range(1), '[2010-01-02 10:10, 2010-01-02 11:00)');
+ values(int4range(125, 125, '[]'), int4range(1, 1, '[]'), '[2010-01-02 10:10, 2010-01-02 11:00)');
-- test bigint ranges
select int8range(10000000000::int8, 20000000000::int8,'(]');
-- Arrays of ranges
--
-select ARRAY[numrange(1.1), numrange(12.3,155.5)];
+select ARRAY[numrange(1.1, 1.2), numrange(12.3, 155.5)];
create table i8r_array (f1 int, f2 int8range[]);
insert into i8r_array values (42, array[int8range(1,10), int8range(2,20)]);