diff options
author | Tom Lane | 2011-11-16 23:21:34 +0000 |
---|---|---|
committer | Tom Lane | 2011-11-16 23:21:34 +0000 |
commit | 4509033a00df5f49c42a21772d8d617efe83e549 (patch) | |
tree | d1c4bda08a9a1b3e9bb57e3e818b9ee707045111 /src/test | |
parent | ff4fd4bf53c5512427f8ecea08d6ca7777efa2c5 (diff) |
Fix assorted infelicities, such as dependency on OIDs that aren't
hardwired, as well as outright misdeclaration of daterange_canonical(),
which resulted in crashes if you invoked it directly. Add some more
regression tests to try to catch similar mistakes in future.
Diffstat (limited to 'src/test')
-rw-r--r-- | src/test/regress/expected/rangetypes.out | 26 | ||||
-rw-r--r-- | src/test/regress/expected/type_sanity.out | 50 | ||||
-rw-r--r-- | src/test/regress/sql/rangetypes.sql | 12 | ||||
-rw-r--r-- | src/test/regress/sql/type_sanity.sql | 41 |
4 files changed, 108 insertions, 21 deletions
diff --git a/src/test/regress/expected/rangetypes.out b/src/test/regress/expected/rangetypes.out index b2258b9045..ba18272ff0 100644 --- a/src/test/regress/expected/rangetypes.out +++ b/src/test/regress/expected/rangetypes.out @@ -175,7 +175,7 @@ SELECT lower_inc(nr), lower(nr), upper(nr), upper_inc(nr) FROM numrange_test t | 1.7 | 1.7 | t (2 rows) -SELECT * FROM numrange_test WHERE contains(nr, numrange(1.9,1.91)); +SELECT * FROM numrange_test WHERE range_contains(nr, numrange(1.9,1.91)); nr ----------- (,) @@ -189,7 +189,7 @@ SELECT * FROM numrange_test WHERE nr @> numrange(1.0,10000.1); (,) (1 row) -SELECT * FROM numrange_test WHERE contained_by(numrange(-1e7,-10000.1), nr); +SELECT * FROM numrange_test WHERE range_contained_by(numrange(-1e7,-10000.1), nr); nr ------ (,) @@ -229,9 +229,9 @@ select numrange(2.0, 3.0) -|- numrange(3.0, 4.0); t (1 row) -select adjacent(numrange(2.0, 3.0), numrange(3.1, 4.0)); - adjacent ----------- +select range_adjacent(numrange(2.0, 3.0), numrange(3.1, 4.0)); + range_adjacent +---------------- f (1 row) @@ -247,9 +247,9 @@ select numrange(1.0, 2.0) -|- numrange(2.0, 3.0,'[]'); t (1 row) -select adjacent(numrange(2.0, 3.0, '(]'), numrange(1.0, 2.0, '(]')); - adjacent ----------- +select range_adjacent(numrange(2.0, 3.0, '(]'), numrange(1.0, 2.0, '(]')); + range_adjacent +---------------- t (1 row) @@ -283,15 +283,15 @@ select numrange(1.1, 2.2,'[]') - numrange(2.0, 3.0); [1.1,2.0) (1 row) -select minus(numrange(10.1,12.2,'[]'), numrange(110.0,120.2,'(]')); - minus +select range_minus(numrange(10.1,12.2,'[]'), numrange(110.0,120.2,'(]')); + range_minus ------------- [10.1,12.2] (1 row) -select minus(numrange(10.1,12.2,'[]'), numrange(0.0,120.2,'(]')); - minus -------- +select range_minus(numrange(10.1,12.2,'[]'), numrange(0.0,120.2,'(]')); + range_minus +------------- empty (1 row) diff --git a/src/test/regress/expected/type_sanity.out b/src/test/regress/expected/type_sanity.out index a159ac718a..19d437ade5 100644 --- a/src/test/regress/expected/type_sanity.out +++ b/src/test/regress/expected/type_sanity.out @@ -1,7 +1,7 @@ -- -- TYPE_SANITY -- Sanity checks for common errors in making type-related system tables: --- pg_type, pg_class, pg_attribute. +-- pg_type, pg_class, pg_attribute, pg_range. -- -- None of the SELECTs here should ever find any matching entries, -- so the expected output is easy to maintain ;-). @@ -367,3 +367,51 @@ WHERE p1.atttypid = p2.oid AND ----------+---------+-----+--------- (0 rows) +-- **************** pg_range **************** +-- Look for illegal values in pg_range fields. +SELECT p1.rngtypid, p1.rngsubtype +FROM pg_range as p1 +WHERE p1.rngtypid = 0 OR p1.rngsubtype = 0 OR p1.rngsubopc = 0; + rngtypid | rngsubtype +----------+------------ +(0 rows) + +-- rngcollation should be specified iff subtype is collatable +SELECT p1.rngtypid, p1.rngsubtype, p1.rngcollation, t.typcollation +FROM pg_range p1 JOIN pg_type t ON t.oid = p1.rngsubtype +WHERE (rngcollation = 0) != (typcollation = 0); + rngtypid | rngsubtype | rngcollation | typcollation +----------+------------+--------------+-------------- +(0 rows) + +-- opclass had better be a btree opclass accepting the subtype. +-- We must allow anyarray matches, cf opr_sanity's binary_coercible() +SELECT p1.rngtypid, p1.rngsubtype, o.opcmethod, o.opcname +FROM pg_range p1 JOIN pg_opclass o ON o.oid = p1.rngsubopc +WHERE o.opcmethod != 403 OR + ((o.opcintype != p1.rngsubtype) AND NOT + (o.opcintype = 'pg_catalog.anyarray'::regtype AND + EXISTS(select 1 from pg_catalog.pg_type where + oid = p1.rngsubtype and typelem != 0 and typlen = -1))); + rngtypid | rngsubtype | opcmethod | opcname +----------+------------+-----------+--------- +(0 rows) + +-- canonical function, if any, had better match the range type +SELECT p1.rngtypid, p1.rngsubtype, p.proname +FROM pg_range p1 JOIN pg_proc p ON p.oid = p1.rngcanonical +WHERE pronargs != 1 OR proargtypes[0] != rngtypid OR prorettype != rngtypid; + rngtypid | rngsubtype | proname +----------+------------+--------- +(0 rows) + +-- subdiff function, if any, had better match the subtype +SELECT p1.rngtypid, p1.rngsubtype, p.proname +FROM pg_range p1 JOIN pg_proc p ON p.oid = p1.rngsubdiff +WHERE pronargs != 2 + OR proargtypes[0] != rngsubtype OR proargtypes[1] != rngsubtype + OR prorettype != 'pg_catalog.float8'::regtype; + rngtypid | rngsubtype | proname +----------+------------+--------- +(0 rows) + diff --git a/src/test/regress/sql/rangetypes.sql b/src/test/regress/sql/rangetypes.sql index 4b455f1d35..4e122a36cc 100644 --- a/src/test/regress/sql/rangetypes.sql +++ b/src/test/regress/sql/rangetypes.sql @@ -54,9 +54,9 @@ SELECT isempty(nr) FROM numrange_test; SELECT lower_inc(nr), lower(nr), upper(nr), upper_inc(nr) FROM numrange_test WHERE NOT isempty(nr) AND NOT lower_inf(nr) AND NOT upper_inf(nr); -SELECT * FROM numrange_test WHERE contains(nr, numrange(1.9,1.91)); +SELECT * FROM numrange_test WHERE range_contains(nr, numrange(1.9,1.91)); SELECT * FROM numrange_test WHERE nr @> numrange(1.0,10000.1); -SELECT * FROM numrange_test WHERE contained_by(numrange(-1e7,-10000.1), nr); +SELECT * FROM numrange_test WHERE range_contained_by(numrange(-1e7,-10000.1), nr); SELECT * FROM numrange_test WHERE 1.9 <@ nr; SELECT * FROM numrange_test WHERE nr = 'empty'; SELECT * FROM numrange_test WHERE range_eq(nr, '(1.1, 2.2)'); @@ -65,10 +65,10 @@ SELECT * FROM numrange_test WHERE nr = '[1.1, 2.2)'; select numrange(2.0, 1.0); select numrange(2.0, 3.0) -|- numrange(3.0, 4.0); -select adjacent(numrange(2.0, 3.0), numrange(3.1, 4.0)); +select range_adjacent(numrange(2.0, 3.0), numrange(3.1, 4.0)); select numrange(2.0, 3.0, '[]') -|- numrange(3.0, 4.0, '()'); select numrange(1.0, 2.0) -|- numrange(2.0, 3.0,'[]'); -select adjacent(numrange(2.0, 3.0, '(]'), numrange(1.0, 2.0, '(]')); +select range_adjacent(numrange(2.0, 3.0, '(]'), numrange(1.0, 2.0, '(]')); select numrange(1.1, 3.3) <@ numrange(0.1,10.1); select numrange(0.1, 10.1) <@ numrange(1.1,3.3); @@ -76,8 +76,8 @@ select numrange(0.1, 10.1) <@ numrange(1.1,3.3); select numrange(1.1, 2.2) - numrange(2.0, 3.0); select numrange(1.1, 2.2) - numrange(2.2, 3.0); select numrange(1.1, 2.2,'[]') - numrange(2.0, 3.0); -select minus(numrange(10.1,12.2,'[]'), numrange(110.0,120.2,'(]')); -select minus(numrange(10.1,12.2,'[]'), numrange(0.0,120.2,'(]')); +select range_minus(numrange(10.1,12.2,'[]'), numrange(110.0,120.2,'(]')); +select range_minus(numrange(10.1,12.2,'[]'), numrange(0.0,120.2,'(]')); select numrange(4.5, 5.5, '[]') && numrange(5.5, 6.5); select numrange(1.0, 2.0) << numrange(3.0, 4.0); diff --git a/src/test/regress/sql/type_sanity.sql b/src/test/regress/sql/type_sanity.sql index 2ed03f39bc..d7d9cea5dc 100644 --- a/src/test/regress/sql/type_sanity.sql +++ b/src/test/regress/sql/type_sanity.sql @@ -1,7 +1,7 @@ -- -- TYPE_SANITY -- Sanity checks for common errors in making type-related system tables: --- pg_type, pg_class, pg_attribute. +-- pg_type, pg_class, pg_attribute, pg_range. -- -- None of the SELECTs here should ever find any matching entries, -- so the expected output is easy to maintain ;-). @@ -285,3 +285,42 @@ WHERE p1.atttypid = p2.oid AND p1.attalign != p2.typalign OR p1.attbyval != p2.typbyval OR (p1.attstorage != p2.typstorage AND p1.attstorage != 'p')); + +-- **************** pg_range **************** + +-- Look for illegal values in pg_range fields. + +SELECT p1.rngtypid, p1.rngsubtype +FROM pg_range as p1 +WHERE p1.rngtypid = 0 OR p1.rngsubtype = 0 OR p1.rngsubopc = 0; + +-- rngcollation should be specified iff subtype is collatable + +SELECT p1.rngtypid, p1.rngsubtype, p1.rngcollation, t.typcollation +FROM pg_range p1 JOIN pg_type t ON t.oid = p1.rngsubtype +WHERE (rngcollation = 0) != (typcollation = 0); + +-- opclass had better be a btree opclass accepting the subtype. +-- We must allow anyarray matches, cf opr_sanity's binary_coercible() + +SELECT p1.rngtypid, p1.rngsubtype, o.opcmethod, o.opcname +FROM pg_range p1 JOIN pg_opclass o ON o.oid = p1.rngsubopc +WHERE o.opcmethod != 403 OR + ((o.opcintype != p1.rngsubtype) AND NOT + (o.opcintype = 'pg_catalog.anyarray'::regtype AND + EXISTS(select 1 from pg_catalog.pg_type where + oid = p1.rngsubtype and typelem != 0 and typlen = -1))); + +-- canonical function, if any, had better match the range type + +SELECT p1.rngtypid, p1.rngsubtype, p.proname +FROM pg_range p1 JOIN pg_proc p ON p.oid = p1.rngcanonical +WHERE pronargs != 1 OR proargtypes[0] != rngtypid OR prorettype != rngtypid; + +-- subdiff function, if any, had better match the subtype + +SELECT p1.rngtypid, p1.rngsubtype, p.proname +FROM pg_range p1 JOIN pg_proc p ON p.oid = p1.rngsubdiff +WHERE pronargs != 2 + OR proargtypes[0] != rngsubtype OR proargtypes[1] != rngsubtype + OR prorettype != 'pg_catalog.float8'::regtype; |