Remove zero- and one-argument range constructor functions.
authorTom Lane <tgl@sss.pgh.pa.us>
Wed, 23 Nov 2011 01:45:05 +0000 (20:45 -0500)
committerTom Lane <tgl@sss.pgh.pa.us>
Wed, 23 Nov 2011 01:45:05 +0000 (20:45 -0500)
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.

doc/src/sgml/rangetypes.sgml
src/backend/commands/typecmds.c
src/backend/utils/adt/rangetypes.c
src/include/catalog/catversion.h
src/include/catalog/pg_proc.h
src/include/utils/rangetypes.h
src/test/regress/expected/rangetypes.out
src/test/regress/sql/rangetypes.sql

index 4a888a021dd7ba93b37017ea04c9446097c333f1..083560e9b2eab6efc9b2aae3c67dbac77d8882f8 100644 (file)
@@ -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>
index 54105f2c408106354592b11cead7dc56074c9747..1516a2aba4f12852c38ed50c21af282a4ea45746 100644 (file)
@@ -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,
index dbad4bf6020d2028526871458d2a01db1b59890a..3326cb17c895273fd01c4eda5eb0d65a521d0168 100644 (file)
@@ -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);
-}
-
 
 /*
  *----------------------------------------------------------
index 853aa37e9d08e413693da6d8224d379661179442..0dbc06cc9a90d73d686379754aa4cee6f02a8a0e 100644 (file)
@@ -53,6 +53,6 @@
  */
 
 /*                                                     yyyymmddN */
-#define CATALOG_VERSION_NO     201111221
+#define CATALOG_VERSION_NO     201111222
 
 #endif
index 137cb8c787604f6fd70eb3d77a997b81a0e527d9..b78af82bf53da89744d6380cf4888a2c7f3e7ae5 100644 (file)
@@ -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_ ));
index f64f7c887e3ffb7f398666f9a11ee9262ddbc2eb..17915504f930e1efc41824535763b22a0bf8c7e7 100644 (file)
@@ -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);
index 4083a02542d0f1c0e74eb218c92aa65f93fc0fd9..094b89493ea1202ba3446fa9cf3a8d9a9107ffd6 100644 (file)
@@ -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[]);
index 1136debfb963913406997635f8f99bf3ae393d90..08d6976e045621955d86c24ad9a132fcb489af5c 100644 (file)
@@ -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)]);