diff --git a/doc/src/sgml/rangetypes.sgml b/doc/src/sgml/rangetypes.sgml index 4a888a021dd7ba93b37017ea04c9446097c333f1..083560e9b2eab6efc9b2aae3c67dbac77d8882f8 100644 --- a/doc/src/sgml/rangetypes.sgml +++ b/doc/src/sgml/rangetypes.sgml @@ -242,12 +242,11 @@ select '[4,4]'::int4range; 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 @@ -255,7 +254,7 @@ select '[4,4]'::int4range; 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, '(]'); @@ -268,13 +267,6 @@ SELECT int8range(1, 14, '(]'); -- 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> diff --git a/src/backend/commands/typecmds.c b/src/backend/commands/typecmds.c index 54105f2c408106354592b11cead7dc56074c9747..1516a2aba4f12852c38ed50c21af282a4ea45746 100644 --- a/src/backend/commands/typecmds.c +++ b/src/backend/commands/typecmds.c @@ -1495,11 +1495,9 @@ static void 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, diff --git a/src/backend/utils/adt/rangetypes.c b/src/backend/utils/adt/rangetypes.c index dbad4bf6020d2028526871458d2a01db1b59890a..3326cb17c895273fd01c4eda5eb0d65a521d0168 100644 --- a/src/backend/utils/adt/rangetypes.c +++ b/src/backend/utils/adt/rangetypes.c @@ -350,42 +350,6 @@ get_range_io_data(FunctionCallInfo fcinfo, Oid rngtypid, IOFuncSelector func) *---------------------------------------------------------- */ -/* 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) @@ -1775,28 +1739,6 @@ make_empty_range(TypeCacheEntry *typcache) 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); -} - /* *---------------------------------------------------------- diff --git a/src/include/catalog/catversion.h b/src/include/catalog/catversion.h index 853aa37e9d08e413693da6d8224d379661179442..0dbc06cc9a90d73d686379754aa4cee6f02a8a0e 100644 --- a/src/include/catalog/catversion.h +++ b/src/include/catalog/catversion.h @@ -53,6 +53,6 @@ */ /* yyyymmddN */ -#define CATALOG_VERSION_NO 201111221 +#define CATALOG_VERSION_NO 201111222 #endif diff --git a/src/include/catalog/pg_proc.h b/src/include/catalog/pg_proc.h index 137cb8c787604f6fd70eb3d77a997b81a0e527d9..b78af82bf53da89744d6380cf4888a2c7f3e7ae5 100644 --- a/src/include/catalog/pg_proc.h +++ b/src/include/catalog/pg_proc.h @@ -4432,50 +4432,26 @@ DESCR("float8 difference of two timestamp values"); 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_ )); diff --git a/src/include/utils/rangetypes.h b/src/include/utils/rangetypes.h index f64f7c887e3ffb7f398666f9a11ee9262ddbc2eb..17915504f930e1efc41824535763b22a0bf8c7e7 100644 --- a/src/include/utils/rangetypes.h +++ b/src/include/utils/rangetypes.h @@ -82,8 +82,6 @@ extern Datum range_recv(PG_FUNCTION_ARGS); 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); @@ -158,7 +156,6 @@ extern int range_cmp_bounds(TypeCacheEntry *typcache, RangeBound *b1, 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); diff --git a/src/test/regress/expected/rangetypes.out b/src/test/regress/expected/rangetypes.out index 4083a02542d0f1c0e74eb218c92aa65f93fc0fd9..094b89493ea1202ba3446fa9cf3a8d9a9107ffd6 100644 --- a/src/test/regress/expected/rangetypes.out +++ b/src/test/regress/expected/rangetypes.out @@ -191,7 +191,7 @@ INSERT INTO numrange_test VALUES('[3,]'); 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 -----------+---------+-------+------- @@ -839,17 +839,17 @@ create table test_range_excl( 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 @@ -1000,10 +1000,10 @@ HINT: No function matches the given name and argument types. You might need to -- -- 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[]); diff --git a/src/test/regress/sql/rangetypes.sql b/src/test/regress/sql/rangetypes.sql index 1136debfb963913406997635f8f99bf3ae393d90..08d6976e045621955d86c24ad9a132fcb489af5c 100644 --- a/src/test/regress/sql/rangetypes.sql +++ b/src/test/regress/sql/rangetypes.sql @@ -54,7 +54,7 @@ INSERT INTO numrange_test VALUES('[3,]'); 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; @@ -239,15 +239,15 @@ create 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)'); 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,'(]'); @@ -344,7 +344,7 @@ select rangetypes_sql(numrange(1,10), ARRAY[2,20]); -- match failure -- 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)]);