Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit df73584

Browse files
committed
Remove zero- and one-argument range constructor functions.
Per discussion, the zero-argument forms aren't really worth the catalog space (just write 'empty' instead). The one-argument forms have some use, but they also have a serious problem with looking too much like functional cast notation; to the point where in many real use-cases, the parser would misinterpret what was wanted. Committing this as a separate patch, with the thought that we might want to revert part or all of it if we can think of some way around the cast ambiguity.
1 parent cddc819 commit df73584

File tree

8 files changed

+24
-119
lines changed

8 files changed

+24
-119
lines changed

doc/src/sgml/rangetypes.sgml

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -242,20 +242,19 @@ select '[4,4]'::int4range;
242242
type. Using the constructor function is frequently more convenient than
243243
writing a range literal constant, since it avoids the need for extra
244244
quoting of the bound values. The constructor function
245-
accepts from zero to three arguments. The zero-argument form
246-
constructs an empty range; the one-argument form constructs a
247-
singleton range; the two-argument form constructs a range in
248-
standard form (lower bound inclusive, upper bound exclusive);
249-
and the three-argument form constructs a range in a form specified by the
250-
third argument. The third argument must be one of the strings
245+
accepts two or three arguments. The two-argument form constructs a range
246+
in standard form (lower bound inclusive, upper bound exclusive), while
247+
the three-argument form constructs a range with bounds of the form
248+
specified by the third argument.
249+
The third argument must be one of the strings
251250
<quote><literal>()</literal></quote>,
252251
<quote><literal>(]</literal></quote>,
253252
<quote><literal>[)</literal></quote>, or
254253
<quote><literal>[]</literal></quote>.
255254
For example:
256255

257256
<programlisting>
258-
-- Three-argument form: lower bound, upper bound, and third argument indicating
257+
-- The full form is: lower bound, upper bound, and text argument indicating
259258
-- inclusivity/exclusivity of bounds.
260259
SELECT numrange(1.0, 14.0, '(]');
261260

@@ -268,13 +267,6 @@ SELECT int8range(1, 14, '(]');
268267

269268
-- Using NULL for either bound causes the range to be unbounded on that side.
270269
SELECT numrange(NULL, 2.2);
271-
272-
-- Single argument constructs a singleton range; that is a range consisting of
273-
-- just one point.
274-
SELECT numrange(11.1);
275-
276-
-- Zero-argument form constructs an empty range.
277-
SELECT numrange();
278270
</programlisting>
279271
</para>
280272
</sect2>

src/backend/commands/typecmds.c

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1495,11 +1495,9 @@ static void
14951495
makeRangeConstructors(const char *name, Oid namespace,
14961496
Oid rangeOid, Oid subtype)
14971497
{
1498-
static const char * const prosrc[4] = {"range_constructor0",
1499-
"range_constructor1",
1500-
"range_constructor2",
1498+
static const char * const prosrc[2] = {"range_constructor2",
15011499
"range_constructor3"};
1502-
static const int pronargs[4] = {0, 1, 2, 3};
1500+
static const int pronargs[2] = {2, 3};
15031501

15041502
Oid constructorArgTypes[3];
15051503
ObjectAddress myself,

src/backend/utils/adt/rangetypes.c

Lines changed: 0 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -350,42 +350,6 @@ get_range_io_data(FunctionCallInfo fcinfo, Oid rngtypid, IOFuncSelector func)
350350
*----------------------------------------------------------
351351
*/
352352

353-
/* Construct empty range value from no arguments */
354-
Datum
355-
range_constructor0(PG_FUNCTION_ARGS)
356-
{
357-
Oid rngtypid = get_fn_expr_rettype(fcinfo->flinfo);
358-
RangeType *range;
359-
TypeCacheEntry *typcache;
360-
361-
typcache = range_get_typcache(fcinfo, rngtypid);
362-
363-
range = make_empty_range(typcache);
364-
365-
PG_RETURN_RANGE(range);
366-
}
367-
368-
/* Construct singleton range value from one argument */
369-
Datum
370-
range_constructor1(PG_FUNCTION_ARGS)
371-
{
372-
Datum arg1 = PG_GETARG_DATUM(0);
373-
Oid rngtypid = get_fn_expr_rettype(fcinfo->flinfo);
374-
RangeType *range;
375-
TypeCacheEntry *typcache;
376-
377-
typcache = range_get_typcache(fcinfo, rngtypid);
378-
379-
if (PG_ARGISNULL(0))
380-
ereport(ERROR,
381-
(errcode(ERRCODE_DATA_EXCEPTION),
382-
errmsg("range constructor argument must not be NULL")));
383-
384-
range = make_singleton_range(typcache, arg1);
385-
386-
PG_RETURN_RANGE(range);
387-
}
388-
389353
/* Construct standard-form range value from two arguments */
390354
Datum
391355
range_constructor2(PG_FUNCTION_ARGS)
@@ -1775,28 +1739,6 @@ make_empty_range(TypeCacheEntry *typcache)
17751739
return make_range(typcache, &lower, &upper, true);
17761740
}
17771741

1778-
/*
1779-
* Build a range value representing a single point.
1780-
*/
1781-
RangeType *
1782-
make_singleton_range(TypeCacheEntry *typcache, Datum val)
1783-
{
1784-
RangeBound lower;
1785-
RangeBound upper;
1786-
1787-
lower.val = val;
1788-
lower.infinite = false;
1789-
lower.inclusive = true;
1790-
lower.lower = true;
1791-
1792-
upper.val = val;
1793-
upper.infinite = false;
1794-
upper.inclusive = true;
1795-
upper.lower = false;
1796-
1797-
return make_range(typcache, &lower, &upper, false);
1798-
}
1799-
18001742

18011743
/*
18021744
*----------------------------------------------------------

src/include/catalog/catversion.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,6 @@
5353
*/
5454

5555
/* yyyymmddN */
56-
#define CATALOG_VERSION_NO 201111221
56+
#define CATALOG_VERSION_NO 201111222
5757

5858
#endif

src/include/catalog/pg_proc.h

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -4432,50 +4432,26 @@ DESCR("float8 difference of two timestamp values");
44324432
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_ ));
44334433
DESCR("float8 difference of two timestamp with time zone values");
44344434

4435-
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_ ));
4436-
DESCR("int4range constructor");
4437-
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_ ));
4438-
DESCR("int4range constructor");
44394435
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_ ));
44404436
DESCR("int4range constructor");
44414437
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_ ));
44424438
DESCR("int4range constructor");
4443-
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_ ));
4444-
DESCR("numrange constructor");
4445-
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_ ));
4446-
DESCR("numrange constructor");
44474439
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_ ));
44484440
DESCR("numrange constructor");
44494441
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_ ));
44504442
DESCR("numrange constructor");
4451-
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_ ));
4452-
DESCR("tsrange constructor");
4453-
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_ ));
4454-
DESCR("tsrange constructor");
44554443
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_ ));
44564444
DESCR("tsrange constructor");
44574445
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_ ));
44584446
DESCR("tsrange constructor");
4459-
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_ ));
4460-
DESCR("tstzrange constructor");
4461-
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_ ));
4462-
DESCR("tstzrange constructor");
44634447
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_ ));
44644448
DESCR("tstzrange constructor");
44654449
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_ ));
44664450
DESCR("tstzrange constructor");
4467-
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_ ));
4468-
DESCR("daterange constructor");
4469-
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_ ));
4470-
DESCR("daterange constructor");
44714451
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_ ));
44724452
DESCR("daterange constructor");
44734453
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_ ));
44744454
DESCR("daterange constructor");
4475-
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_ ));
4476-
DESCR("int8range constructor");
4477-
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_ ));
4478-
DESCR("int8range constructor");
44794455
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_ ));
44804456
DESCR("int8range constructor");
44814457
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_ ));

src/include/utils/rangetypes.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -82,8 +82,6 @@ extern Datum range_recv(PG_FUNCTION_ARGS);
8282
extern Datum range_send(PG_FUNCTION_ARGS);
8383

8484
/* constructors */
85-
extern Datum range_constructor0(PG_FUNCTION_ARGS);
86-
extern Datum range_constructor1(PG_FUNCTION_ARGS);
8785
extern Datum range_constructor2(PG_FUNCTION_ARGS);
8886
extern Datum range_constructor3(PG_FUNCTION_ARGS);
8987

@@ -158,7 +156,6 @@ extern int range_cmp_bounds(TypeCacheEntry *typcache, RangeBound *b1,
158156
extern int range_cmp_bound_values(TypeCacheEntry *typcache, RangeBound *b1,
159157
RangeBound *b2);
160158
extern RangeType *make_empty_range(TypeCacheEntry *typcache);
161-
extern RangeType *make_singleton_range(TypeCacheEntry *typcache, Datum val);
162159

163160
/* GiST support (in rangetypes_gist.c) */
164161
extern Datum range_gist_consistent(PG_FUNCTION_ARGS);

src/test/regress/expected/rangetypes.out

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ INSERT INTO numrange_test VALUES('[3,]');
191191
INSERT INTO numrange_test VALUES('[, 5)');
192192
INSERT INTO numrange_test VALUES(numrange(1.1, 2.2));
193193
INSERT INTO numrange_test VALUES('empty');
194-
INSERT INTO numrange_test VALUES(numrange(1.7));
194+
INSERT INTO numrange_test VALUES(numrange(1.7, 1.7, '[]'));
195195
SELECT nr, isempty(nr), lower(nr), upper(nr) FROM numrange_test;
196196
nr | isempty | lower | upper
197197
-----------+---------+-------+-------
@@ -839,17 +839,17 @@ create table test_range_excl(
839839
NOTICE: CREATE TABLE / EXCLUDE will create implicit index "test_range_excl_room_during_excl" for table "test_range_excl"
840840
NOTICE: CREATE TABLE / EXCLUDE will create implicit index "test_range_excl_speaker_during_excl" for table "test_range_excl"
841841
insert into test_range_excl
842-
values(int4range(123), int4range(1), '[2010-01-02 10:00, 2010-01-02 11:00)');
842+
values(int4range(123, 123, '[]'), int4range(1, 1, '[]'), '[2010-01-02 10:00, 2010-01-02 11:00)');
843843
insert into test_range_excl
844-
values(int4range(123), int4range(2), '[2010-01-02 11:00, 2010-01-02 12:00)');
844+
values(int4range(123, 123, '[]'), int4range(2, 2, '[]'), '[2010-01-02 11:00, 2010-01-02 12:00)');
845845
insert into test_range_excl
846-
values(int4range(123), int4range(3), '[2010-01-02 10:10, 2010-01-02 11:00)');
846+
values(int4range(123, 123, '[]'), int4range(3, 3, '[]'), '[2010-01-02 10:10, 2010-01-02 11:00)');
847847
ERROR: conflicting key value violates exclusion constraint "test_range_excl_room_during_excl"
848848
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")).
849849
insert into test_range_excl
850-
values(int4range(124), int4range(3), '[2010-01-02 10:10, 2010-01-02 11:10)');
850+
values(int4range(124, 124, '[]'), int4range(3, 3, '[]'), '[2010-01-02 10:10, 2010-01-02 11:10)');
851851
insert into test_range_excl
852-
values(int4range(125), int4range(1), '[2010-01-02 10:10, 2010-01-02 11:00)');
852+
values(int4range(125, 125, '[]'), int4range(1, 1, '[]'), '[2010-01-02 10:10, 2010-01-02 11:00)');
853853
ERROR: conflicting key value violates exclusion constraint "test_range_excl_speaker_during_excl"
854854
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")).
855855
-- test bigint ranges
@@ -1000,10 +1000,10 @@ HINT: No function matches the given name and argument types. You might need to
10001000
--
10011001
-- Arrays of ranges
10021002
--
1003-
select ARRAY[numrange(1.1), numrange(12.3,155.5)];
1003+
select ARRAY[numrange(1.1, 1.2), numrange(12.3, 155.5)];
10041004
array
10051005
------------------------------
1006-
{"[1.1,1.1]","[12.3,155.5)"}
1006+
{"[1.1,1.2)","[12.3,155.5)"}
10071007
(1 row)
10081008

10091009
create table i8r_array (f1 int, f2 int8range[]);

src/test/regress/sql/rangetypes.sql

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ INSERT INTO numrange_test VALUES('[3,]');
5454
INSERT INTO numrange_test VALUES('[, 5)');
5555
INSERT INTO numrange_test VALUES(numrange(1.1, 2.2));
5656
INSERT INTO numrange_test VALUES('empty');
57-
INSERT INTO numrange_test VALUES(numrange(1.7));
57+
INSERT INTO numrange_test VALUES(numrange(1.7, 1.7, '[]'));
5858

5959
SELECT nr, isempty(nr), lower(nr), upper(nr) FROM numrange_test;
6060
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(
239239
);
240240

241241
insert into test_range_excl
242-
values(int4range(123), int4range(1), '[2010-01-02 10:00, 2010-01-02 11:00)');
242+
values(int4range(123, 123, '[]'), int4range(1, 1, '[]'), '[2010-01-02 10:00, 2010-01-02 11:00)');
243243
insert into test_range_excl
244-
values(int4range(123), int4range(2), '[2010-01-02 11:00, 2010-01-02 12:00)');
244+
values(int4range(123, 123, '[]'), int4range(2, 2, '[]'), '[2010-01-02 11:00, 2010-01-02 12:00)');
245245
insert into test_range_excl
246-
values(int4range(123), int4range(3), '[2010-01-02 10:10, 2010-01-02 11:00)');
246+
values(int4range(123, 123, '[]'), int4range(3, 3, '[]'), '[2010-01-02 10:10, 2010-01-02 11:00)');
247247
insert into test_range_excl
248-
values(int4range(124), int4range(3), '[2010-01-02 10:10, 2010-01-02 11:10)');
248+
values(int4range(124, 124, '[]'), int4range(3, 3, '[]'), '[2010-01-02 10:10, 2010-01-02 11:10)');
249249
insert into test_range_excl
250-
values(int4range(125), int4range(1), '[2010-01-02 10:10, 2010-01-02 11:00)');
250+
values(int4range(125, 125, '[]'), int4range(1, 1, '[]'), '[2010-01-02 10:10, 2010-01-02 11:00)');
251251

252252
-- test bigint ranges
253253
select int8range(10000000000::int8, 20000000000::int8,'(]');
@@ -344,7 +344,7 @@ select rangetypes_sql(numrange(1,10), ARRAY[2,20]); -- match failure
344344
-- Arrays of ranges
345345
--
346346

347-
select ARRAY[numrange(1.1), numrange(12.3,155.5)];
347+
select ARRAY[numrange(1.1, 1.2), numrange(12.3, 155.5)];
348348

349349
create table i8r_array (f1 int, f2 int8range[]);
350350
insert into i8r_array values (42, array[int8range(1,10), int8range(2,20)]);

0 commit comments

Comments
 (0)