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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy