1
0
mirror of https://github.com/postgres/postgres.git synced 2025-07-05 07:21:24 +03:00

Add geometry/range functions to support BRIN inclusion

This commit adds the following functions:
    box(point) -> box
    bound_box(box, box) -> box
    inet_same_family(inet, inet) -> bool
    inet_merge(inet, inet) -> cidr
    range_merge(anyrange, anyrange) -> anyrange

The first of these is also used to implement a new assignment cast from
point to box.

These functions are the first part of a base to implement an "inclusion"
operator class for BRIN, for multidimensional data types.

Author: Emre Hasegeli
Reviewed by: Andreas Karlsson
This commit is contained in:
Alvaro Herrera
2015-05-05 15:22:24 -03:00
parent 456ff08638
commit 3b6db1f445
18 changed files with 363 additions and 16 deletions

View File

@ -278,6 +278,40 @@ SELECT '' AS twenty, b.f1 / p.f1 AS rotation
| (0.3,0),(0.3,0)
(20 rows)
SELECT f1::box
FROM POINT_TBL;
f1
-----------------------
(0,0),(0,0)
(-10,0),(-10,0)
(-3,4),(-3,4)
(5.1,34.5),(5.1,34.5)
(-5,-12),(-5,-12)
(10,10),(10,10)
(6 rows)
SELECT bound_box(a.f1, b.f1)
FROM BOX_TBL a, BOX_TBL b;
bound_box
---------------------
(2,2),(0,0)
(3,3),(0,0)
(2.5,3.5),(0,0)
(3,3),(0,0)
(3,3),(0,0)
(3,3),(1,1)
(3,3.5),(1,1)
(3,3),(1,1)
(2.5,3.5),(0,0)
(3,3.5),(1,1)
(2.5,3.5),(2.5,2.5)
(3,3.5),(2.5,2.5)
(3,3),(0,0)
(3,3),(1,1)
(3,3.5),(2.5,2.5)
(3,3),(3,3)
(16 rows)
--
-- Paths
--

View File

@ -278,6 +278,40 @@ SELECT '' AS twenty, b.f1 / p.f1 AS rotation
| (0.3,0),(0.3,0)
(20 rows)
SELECT f1::box
FROM POINT_TBL;
f1
-----------------------
(0,0),(0,0)
(-10,0),(-10,0)
(-3,4),(-3,4)
(5.1,34.5),(5.1,34.5)
(-5,-12),(-5,-12)
(10,10),(10,10)
(6 rows)
SELECT bound_box(a.f1, b.f1)
FROM BOX_TBL a, BOX_TBL b;
bound_box
---------------------
(2,2),(0,0)
(3,3),(0,0)
(2.5,3.5),(0,0)
(3,3),(0,0)
(3,3),(0,0)
(3,3),(1,1)
(3,3.5),(1,1)
(3,3),(1,1)
(2.5,3.5),(0,0)
(3,3.5),(1,1)
(2.5,3.5),(2.5,2.5)
(3,3.5),(2.5,2.5)
(3,3),(0,0)
(3,3),(1,1)
(3,3.5),(2.5,2.5)
(3,3),(3,3)
(16 rows)
--
-- Paths
--

View File

@ -278,6 +278,40 @@ SELECT '' AS twenty, b.f1 / p.f1 AS rotation
| (0.3,0),(0.3,0)
(20 rows)
SELECT f1::box
FROM POINT_TBL;
f1
-----------------------
(0,0),(0,0)
(-10,0),(-10,0)
(-3,4),(-3,4)
(5.1,34.5),(5.1,34.5)
(-5,-12),(-5,-12)
(10,10),(10,10)
(6 rows)
SELECT bound_box(a.f1, b.f1)
FROM BOX_TBL a, BOX_TBL b;
bound_box
---------------------
(2,2),(0,0)
(3,3),(0,0)
(2.5,3.5),(0,0)
(3,3),(0,0)
(3,3),(0,0)
(3,3),(1,1)
(3,3.5),(1,1)
(3,3),(1,1)
(2.5,3.5),(0,0)
(3,3.5),(1,1)
(2.5,3.5),(2.5,2.5)
(3,3.5),(2.5,2.5)
(3,3),(0,0)
(3,3),(1,1)
(3,3.5),(2.5,2.5)
(3,3),(3,3)
(16 rows)
--
-- Paths
--

View File

@ -614,3 +614,31 @@ SELECT '127::1'::inet - '127::2'::inet;
-1
(1 row)
-- insert one more row with addressed from different families
INSERT INTO INET_TBL (c, i) VALUES ('10', '10::/8');
-- now, this one should fail
SELECT inet_merge(c, i) FROM INET_TBL;
ERROR: cannot merge addresses from different families
-- fix it by inet_same_family() condition
SELECT inet_merge(c, i) FROM INET_TBL WHERE inet_same_family(c, i);
inet_merge
-----------------
192.168.1.0/24
192.168.1.0/24
192.168.1.0/24
192.168.1.0/24
192.168.1.0/24
192.168.1.0/24
10.0.0.0/8
10.0.0.0/8
10.1.2.3/32
10.1.2.0/24
10.1.0.0/16
10.0.0.0/8
10.0.0.0/7
8.0.0.0/6
10:23::/64
10:23::8000/113
::/24
(17 rows)

View File

@ -480,8 +480,26 @@ select numrange(1.0, 2.0) + numrange(1.5, 3.0);
[1.0,3.0)
(1 row)
select numrange(1.0, 2.0) + numrange(2.5, 3.0);
select numrange(1.0, 2.0) + numrange(2.5, 3.0); -- should fail
ERROR: result of range union would not be contiguous
select range_merge(numrange(1.0, 2.0), numrange(2.0, 3.0));
range_merge
-------------
[1.0,3.0)
(1 row)
select range_merge(numrange(1.0, 2.0), numrange(1.5, 3.0));
range_merge
-------------
[1.0,3.0)
(1 row)
select range_merge(numrange(1.0, 2.0), numrange(2.5, 3.0)); -- shouldn't fail
range_merge
-------------
[1.0,3.0)
(1 row)
select numrange(1.0, 2.0) * numrange(2.0, 3.0);
?column?
----------

View File

@ -79,6 +79,12 @@ SELECT '' AS twenty, b.f1 / p.f1 AS rotation
FROM BOX_TBL b, POINT_TBL p
WHERE (p.f1 <-> point '(0,0)') >= 1;
SELECT f1::box
FROM POINT_TBL;
SELECT bound_box(a.f1, b.f1)
FROM BOX_TBL a, BOX_TBL b;
--
-- Paths
--

View File

@ -116,3 +116,10 @@ SELECT '127::1'::inet - '126::2'::inet;
-- but not these
SELECT '127::1'::inet + 10000000000;
SELECT '127::1'::inet - '127::2'::inet;
-- insert one more row with addressed from different families
INSERT INTO INET_TBL (c, i) VALUES ('10', '10::/8');
-- now, this one should fail
SELECT inet_merge(c, i) FROM INET_TBL;
-- fix it by inet_same_family() condition
SELECT inet_merge(c, i) FROM INET_TBL WHERE inet_same_family(c, i);

View File

@ -108,7 +108,11 @@ select numrange(1.1, 2.2) < numrange(1.1, 1.2);
select numrange(1.0, 2.0) + numrange(2.0, 3.0);
select numrange(1.0, 2.0) + numrange(1.5, 3.0);
select numrange(1.0, 2.0) + numrange(2.5, 3.0);
select numrange(1.0, 2.0) + numrange(2.5, 3.0); -- should fail
select range_merge(numrange(1.0, 2.0), numrange(2.0, 3.0));
select range_merge(numrange(1.0, 2.0), numrange(1.5, 3.0));
select range_merge(numrange(1.0, 2.0), numrange(2.5, 3.0)); -- shouldn't fail
select numrange(1.0, 2.0) * numrange(2.0, 3.0);
select numrange(1.0, 2.0) * numrange(1.5, 3.0);