mirror of
https://github.com/postgres/postgres.git
synced 2025-07-28 23:42:10 +03:00
Improve test coverage of geometric types
This commit significantly increases test coverage of geo_ops.c, adding
tests for various issues addressed by 2e2a392de3
(which went undetected
for a long time, at least partially due to not being covered).
This also removes alternative results expecting -0 on some platforms.
Instead the functions are should return the same results everywhere,
transforming -0 to 0 if needed.
The tests are added to geometric.sql file, sorted by the left hand side
of the operators. There are many cross datatype operators, so this seems
like the best solution.
Author: Emre Hasegeli
Reviewed-by: Tomas Vondra
Discussion: https://www.postgresql.org/message-id/CAE2gYzxF7-5djV6-cEvqQu-fNsnt%3DEqbOURx7ZDg%2BVv6ZMTWbg%40mail.gmail.com
This commit is contained in:
@ -46,6 +46,103 @@ SELECT '' AS one, p1.f1
|
||||
FROM POINT_TBL p1
|
||||
WHERE p1.f1 ?| point '(5.1,34.5)';
|
||||
|
||||
-- Slope
|
||||
SELECT p1.f1, p2.f1, slope(p1.f1, p2.f1) FROM POINT_TBL p1, POINT_TBL p2;
|
||||
|
||||
-- Add point
|
||||
SELECT p1.f1, p2.f1, p1.f1 + p2.f1 FROM POINT_TBL p1, POINT_TBL p2;
|
||||
|
||||
-- Subtract point
|
||||
SELECT p1.f1, p2.f1, p1.f1 - p2.f1 FROM POINT_TBL p1, POINT_TBL p2;
|
||||
|
||||
-- Multiply with point
|
||||
SELECT p1.f1, p2.f1, p1.f1 * p2.f1 FROM POINT_TBL p1, POINT_TBL p2 WHERE p1.f1[0] BETWEEN 1 AND 1000;
|
||||
|
||||
-- Underflow error
|
||||
SELECT p1.f1, p2.f1, p1.f1 * p2.f1 FROM POINT_TBL p1, POINT_TBL p2 WHERE p1.f1[0] < 1;
|
||||
|
||||
-- Divide by point
|
||||
SELECT p1.f1, p2.f1, p1.f1 / p2.f1 FROM POINT_TBL p1, POINT_TBL p2 WHERE p2.f1[0] BETWEEN 1 AND 1000;
|
||||
|
||||
-- Overflow error
|
||||
SELECT p1.f1, p2.f1, p1.f1 / p2.f1 FROM POINT_TBL p1, POINT_TBL p2 WHERE p2.f1[0] > 1000;
|
||||
|
||||
-- Division by 0 error
|
||||
SELECT p1.f1, p2.f1, p1.f1 / p2.f1 FROM POINT_TBL p1, POINT_TBL p2 WHERE p2.f1 ~= '(0,0)'::point;
|
||||
|
||||
-- Distance to line
|
||||
SELECT p.f1, l.s, p.f1 <-> l.s FROM POINT_TBL p, LINE_TBL l;
|
||||
|
||||
-- Distance to line segment
|
||||
SELECT p.f1, l.s, p.f1 <-> l.s FROM POINT_TBL p, LSEG_TBL l;
|
||||
|
||||
-- Distance to box
|
||||
SELECT p.f1, b.f1, p.f1 <-> b.f1 FROM POINT_TBL p, BOX_TBL b;
|
||||
|
||||
-- Distance to path
|
||||
SELECT p.f1, p1.f1, p.f1 <-> p1.f1 FROM POINT_TBL p, PATH_TBL p1;
|
||||
|
||||
-- Distance to polygon
|
||||
SELECT p.f1, p1.f1, p.f1 <-> p1.f1 FROM POINT_TBL p, POLYGON_TBL p1;
|
||||
|
||||
-- Closest point to line
|
||||
SELECT p.f1, l.s, p.f1 ## l.s FROM POINT_TBL p, LINE_TBL l;
|
||||
|
||||
-- Closest point to line segment
|
||||
SELECT p.f1, l.s, p.f1 ## l.s FROM POINT_TBL p, LSEG_TBL l;
|
||||
|
||||
-- Closest point to box
|
||||
SELECT p.f1, b.f1, p.f1 ## b.f1 FROM POINT_TBL p, BOX_TBL b;
|
||||
|
||||
-- On line
|
||||
SELECT p.f1, l.s FROM POINT_TBL p, LINE_TBL l WHERE p.f1 <@ l.s;
|
||||
|
||||
-- On line segment
|
||||
SELECT p.f1, l.s FROM POINT_TBL p, LSEG_TBL l WHERE p.f1 <@ l.s;
|
||||
|
||||
-- On path
|
||||
SELECT p.f1, p1.f1 FROM POINT_TBL p, PATH_TBL p1 WHERE p.f1 <@ p1.f1;
|
||||
|
||||
--
|
||||
-- Lines
|
||||
--
|
||||
|
||||
-- Vertical
|
||||
SELECT s FROM LINE_TBL WHERE ?| s;
|
||||
|
||||
-- Horizontal
|
||||
SELECT s FROM LINE_TBL WHERE ?- s;
|
||||
|
||||
-- Same as line
|
||||
SELECT l1.s, l2.s FROM LINE_TBL l1, LINE_TBL l2 WHERE l1.s = l2.s;
|
||||
|
||||
-- Parallel to line
|
||||
SELECT l1.s, l2.s FROM LINE_TBL l1, LINE_TBL l2 WHERE l1.s ?|| l2.s;
|
||||
|
||||
-- Perpendicular to line
|
||||
SELECT l1.s, l2.s FROM LINE_TBL l1, LINE_TBL l2 WHERE l1.s ?-| l2.s;
|
||||
|
||||
-- Distance to line
|
||||
SELECT l1.s, l2.s, l1.s <-> l2.s FROM LINE_TBL l1, LINE_TBL l2;
|
||||
|
||||
-- Distance to box
|
||||
SELECT l.s, b.f1, l.s <-> b.f1 FROM LINE_TBL l, BOX_TBL b;
|
||||
|
||||
-- Intersect with line
|
||||
SELECT l1.s, l2.s FROM LINE_TBL l1, LINE_TBL l2 WHERE l1.s ?# l2.s;
|
||||
|
||||
-- Intersect with box
|
||||
SELECT l.s, b.f1 FROM LINE_TBL l, BOX_TBL b WHERE l.s ?# b.f1;
|
||||
|
||||
-- Intersection point with line
|
||||
SELECT l1.s, l2.s, l1.s # l2.s FROM LINE_TBL l1, LINE_TBL l2;
|
||||
|
||||
-- Closest point to line segment
|
||||
SELECT l.s, l1.s, l.s ## l1.s FROM LINE_TBL l, LSEG_TBL l1;
|
||||
|
||||
-- Closest point to box
|
||||
SELECT l.s, b.f1, l.s ## b.f1 FROM LINE_TBL l, BOX_TBL b;
|
||||
|
||||
--
|
||||
-- Line segments
|
||||
--
|
||||
@ -54,9 +151,77 @@ SELECT '' AS one, p1.f1
|
||||
SELECT '' AS count, p.f1, l.s, l.s # p.f1 AS intersection
|
||||
FROM LSEG_TBL l, POINT_TBL p;
|
||||
|
||||
-- closest point
|
||||
SELECT '' AS thirty, p.f1, l.s, p.f1 ## l.s AS closest
|
||||
FROM LSEG_TBL l, POINT_TBL p;
|
||||
-- Length
|
||||
SELECT s, @-@ s FROM LSEG_TBL;
|
||||
|
||||
-- Vertical
|
||||
SELECT s FROM LSEG_TBL WHERE ?| s;
|
||||
|
||||
-- Horizontal
|
||||
SELECT s FROM LSEG_TBL WHERE ?- s;
|
||||
|
||||
-- Center
|
||||
SELECT s, @@ s FROM LSEG_TBL;
|
||||
|
||||
-- To point
|
||||
SELECT s, s::point FROM LSEG_TBL;
|
||||
|
||||
-- Has points less than line segment
|
||||
SELECT l1.s, l2.s FROM LSEG_TBL l1, LSEG_TBL l2 WHERE l1.s < l2.s;
|
||||
|
||||
-- Has points less than or equal to line segment
|
||||
SELECT l1.s, l2.s FROM LSEG_TBL l1, LSEG_TBL l2 WHERE l1.s <= l2.s;
|
||||
|
||||
-- Has points equal to line segment
|
||||
SELECT l1.s, l2.s FROM LSEG_TBL l1, LSEG_TBL l2 WHERE l1.s = l2.s;
|
||||
|
||||
-- Has points greater than or equal to line segment
|
||||
SELECT l1.s, l2.s FROM LSEG_TBL l1, LSEG_TBL l2 WHERE l1.s >= l2.s;
|
||||
|
||||
-- Has points greater than line segment
|
||||
SELECT l1.s, l2.s FROM LSEG_TBL l1, LSEG_TBL l2 WHERE l1.s > l2.s;
|
||||
|
||||
-- Has points not equal to line segment
|
||||
SELECT l1.s, l2.s FROM LSEG_TBL l1, LSEG_TBL l2 WHERE l1.s != l2.s;
|
||||
|
||||
-- Parallel with line segment
|
||||
SELECT l1.s, l2.s FROM LSEG_TBL l1, LSEG_TBL l2 WHERE l1.s ?|| l2.s;
|
||||
|
||||
-- Perpendicular with line segment
|
||||
SELECT l1.s, l2.s FROM LSEG_TBL l1, LSEG_TBL l2 WHERE l1.s ?-| l2.s;
|
||||
|
||||
-- Distance to line
|
||||
SELECT l.s, l1.s, l.s <-> l1.s FROM LSEG_TBL l, LINE_TBL l1;
|
||||
|
||||
-- Distance to line segment
|
||||
SELECT l1.s, l2.s, l1.s <-> l2.s FROM LSEG_TBL l1, LSEG_TBL l2;
|
||||
|
||||
-- Distance to box
|
||||
SELECT l.s, b.f1, l.s <-> b.f1 FROM LSEG_TBL l, BOX_TBL b;
|
||||
|
||||
-- Intersect with line segment
|
||||
SELECT l.s, l1.s FROM LSEG_TBL l, LINE_TBL l1 WHERE l.s ?# l1.s;
|
||||
|
||||
-- Intersect with box
|
||||
SELECT l.s, b.f1 FROM LSEG_TBL l, BOX_TBL b WHERE l.s ?# b.f1;
|
||||
|
||||
-- Intersection point with line segment
|
||||
SELECT l1.s, l2.s, l1.s # l2.s FROM LSEG_TBL l1, LSEG_TBL l2;
|
||||
|
||||
-- Closest point to line
|
||||
SELECT l.s, l1.s, l.s ## l1.s FROM LSEG_TBL l, LINE_TBL l1;
|
||||
|
||||
-- Closest point to line segment
|
||||
SELECT l1.s, l2.s, l1.s ## l2.s FROM LSEG_TBL l1, LSEG_TBL l2;
|
||||
|
||||
-- Closest point to box
|
||||
SELECT l.s, b.f1, l.s ## b.f1 FROM LSEG_TBL l, BOX_TBL b;
|
||||
|
||||
-- On line
|
||||
SELECT l.s, l1.s FROM LSEG_TBL l, LINE_TBL l1 WHERE l.s <@ l1.s;
|
||||
|
||||
-- On box
|
||||
SELECT l.s, b.f1 FROM LSEG_TBL l, BOX_TBL b WHERE l.s <@ b.f1;
|
||||
|
||||
--
|
||||
-- Boxes
|
||||
@ -71,35 +236,94 @@ SELECT '' AS twentyfour, b.f1 + p.f1 AS translation
|
||||
SELECT '' AS twentyfour, b.f1 - p.f1 AS translation
|
||||
FROM BOX_TBL b, POINT_TBL p;
|
||||
|
||||
-- scaling and rotation
|
||||
SELECT '' AS twentyfour, b.f1 * p.f1 AS rotation
|
||||
FROM BOX_TBL b, POINT_TBL p;
|
||||
-- Multiply with point
|
||||
SELECT b.f1, p.f1, b.f1 * p.f1 FROM BOX_TBL b, POINT_TBL p WHERE p.f1[0] BETWEEN 1 AND 1000;
|
||||
|
||||
SELECT '' AS twenty, b.f1 / p.f1 AS rotation
|
||||
FROM BOX_TBL b, POINT_TBL p
|
||||
WHERE (p.f1 <-> point '(0,0)') >= 1;
|
||||
-- Overflow error
|
||||
SELECT b.f1, p.f1, b.f1 * p.f1 FROM BOX_TBL b, POINT_TBL p WHERE p.f1[0] > 1000;
|
||||
|
||||
-- Divide by point
|
||||
SELECT b.f1, p.f1, b.f1 / p.f1 FROM BOX_TBL b, POINT_TBL p WHERE p.f1[0] BETWEEN 1 AND 1000;
|
||||
|
||||
-- To box
|
||||
SELECT f1::box
|
||||
FROM POINT_TBL;
|
||||
|
||||
SELECT bound_box(a.f1, b.f1)
|
||||
FROM BOX_TBL a, BOX_TBL b;
|
||||
|
||||
-- Below box
|
||||
SELECT b1.f1, b2.f1, b1.f1 <^ b2.f1 FROM BOX_TBL b1, BOX_TBL b2;
|
||||
|
||||
-- Above box
|
||||
SELECT b1.f1, b2.f1, b1.f1 >^ b2.f1 FROM BOX_TBL b1, BOX_TBL b2;
|
||||
|
||||
-- Intersection point with box
|
||||
SELECT b1.f1, b2.f1, b1.f1 # b2.f1 FROM BOX_TBL b1, BOX_TBL b2;
|
||||
|
||||
-- Diagonal
|
||||
SELECT f1, diagonal(f1) FROM BOX_TBL;
|
||||
|
||||
-- Distance to box
|
||||
SELECT b1.f1, b2.f1, b1.f1 <-> b2.f1 FROM BOX_TBL b1, BOX_TBL b2;
|
||||
|
||||
--
|
||||
-- Paths
|
||||
--
|
||||
|
||||
SELECT '' AS eight, npoints(f1) AS npoints, f1 AS path FROM PATH_TBL;
|
||||
-- Points
|
||||
SELECT f1, npoints(f1) FROM PATH_TBL;
|
||||
|
||||
SELECT '' AS four, path(f1) FROM POLYGON_TBL;
|
||||
-- Area
|
||||
SELECT f1, area(f1) FROM PATH_TBL;
|
||||
|
||||
-- translation
|
||||
SELECT '' AS eight, p1.f1 + point '(10,10)' AS dist_add
|
||||
FROM PATH_TBL p1;
|
||||
-- Length
|
||||
SELECT f1, @-@ f1 FROM PATH_TBL;
|
||||
|
||||
-- scaling and rotation
|
||||
SELECT '' AS eight, p1.f1 * point '(2,-1)' AS dist_mul
|
||||
FROM PATH_TBL p1;
|
||||
-- Center
|
||||
SELECT f1, @@ f1 FROM PATH_TBL;
|
||||
|
||||
-- To polygon
|
||||
SELECT f1, f1::polygon FROM PATH_TBL WHERE isclosed(f1);
|
||||
|
||||
-- Open path cannot be converted to polygon error
|
||||
SELECT f1, f1::polygon FROM PATH_TBL WHERE isopen(f1);
|
||||
|
||||
-- Has points less than path
|
||||
SELECT p1.f1, p2.f1 FROM PATH_TBL p1, PATH_TBL p2 WHERE p1.f1 < p2.f1;
|
||||
|
||||
-- Has points less than or equal to path
|
||||
SELECT p1.f1, p2.f1 FROM PATH_TBL p1, PATH_TBL p2 WHERE p1.f1 <= p2.f1;
|
||||
|
||||
-- Has points equal to path
|
||||
SELECT p1.f1, p2.f1 FROM PATH_TBL p1, PATH_TBL p2 WHERE p1.f1 = p2.f1;
|
||||
|
||||
-- Has points greater than or equal to path
|
||||
SELECT p1.f1, p2.f1 FROM PATH_TBL p1, PATH_TBL p2 WHERE p1.f1 >= p2.f1;
|
||||
|
||||
-- Has points greater than path
|
||||
SELECT p1.f1, p2.f1 FROM PATH_TBL p1, PATH_TBL p2 WHERE p1.f1 > p2.f1;
|
||||
|
||||
-- Add path
|
||||
SELECT p1.f1, p2.f1, p1.f1 + p2.f1 FROM PATH_TBL p1, PATH_TBL p2;
|
||||
|
||||
-- Add point
|
||||
SELECT p.f1, p1.f1, p.f1 + p1.f1 FROM PATH_TBL p, POINT_TBL p1;
|
||||
|
||||
-- Subtract point
|
||||
SELECT p.f1, p1.f1, p.f1 - p1.f1 FROM PATH_TBL p, POINT_TBL p1;
|
||||
|
||||
-- Multiply with point
|
||||
SELECT p.f1, p1.f1, p.f1 * p1.f1 FROM PATH_TBL p, POINT_TBL p1;
|
||||
|
||||
-- Divide by point
|
||||
SELECT p.f1, p1.f1, p.f1 / p1.f1 FROM PATH_TBL p, POINT_TBL p1 WHERE p1.f1[0] BETWEEN 1 AND 1000;
|
||||
|
||||
-- Division by 0 error
|
||||
SELECT p.f1, p1.f1, p.f1 / p1.f1 FROM PATH_TBL p, POINT_TBL p1 WHERE p1.f1 ~= '(0,0)'::point;
|
||||
|
||||
-- Distance to path
|
||||
SELECT p1.f1, p2.f1, p1.f1 <-> p2.f1 FROM PATH_TBL p1, PATH_TBL p2;
|
||||
|
||||
--
|
||||
-- Polygons
|
||||
@ -125,13 +349,50 @@ SELECT '' AS four, f1 AS open_path, polygon( pclose(f1)) AS polygon
|
||||
FROM PATH_TBL
|
||||
WHERE isopen(f1);
|
||||
|
||||
-- convert circles to polygons using the default number of points
|
||||
SELECT '' AS six, polygon(f1)
|
||||
FROM CIRCLE_TBL;
|
||||
-- To box
|
||||
SELECT f1, f1::box FROM POLYGON_TBL;
|
||||
|
||||
-- convert the circle to an 8-point polygon
|
||||
SELECT '' AS six, polygon(8, f1)
|
||||
FROM CIRCLE_TBL;
|
||||
-- To path
|
||||
SELECT f1, f1::path FROM POLYGON_TBL;
|
||||
|
||||
-- Same as polygon
|
||||
SELECT p1.f1, p2.f1 FROM POLYGON_TBL p1, POLYGON_TBL p2 WHERE p1.f1 ~= p2.f1;
|
||||
|
||||
-- Contained by polygon
|
||||
SELECT p1.f1, p2.f1 FROM POLYGON_TBL p1, POLYGON_TBL p2 WHERE p1.f1 <@ p2.f1;
|
||||
|
||||
-- Contains polygon
|
||||
SELECT p1.f1, p2.f1 FROM POLYGON_TBL p1, POLYGON_TBL p2 WHERE p1.f1 @> p2.f1;
|
||||
|
||||
-- Overlap with polygon
|
||||
SELECT p1.f1, p2.f1 FROM POLYGON_TBL p1, POLYGON_TBL p2 WHERE p1.f1 && p2.f1;
|
||||
|
||||
-- Left of polygon
|
||||
SELECT p1.f1, p2.f1 FROM POLYGON_TBL p1, POLYGON_TBL p2 WHERE p1.f1 << p2.f1;
|
||||
|
||||
-- Overlap of left of polygon
|
||||
SELECT p1.f1, p2.f1 FROM POLYGON_TBL p1, POLYGON_TBL p2 WHERE p1.f1 &< p2.f1;
|
||||
|
||||
-- Right of polygon
|
||||
SELECT p1.f1, p2.f1 FROM POLYGON_TBL p1, POLYGON_TBL p2 WHERE p1.f1 >> p2.f1;
|
||||
|
||||
-- Overlap of right of polygon
|
||||
SELECT p1.f1, p2.f1 FROM POLYGON_TBL p1, POLYGON_TBL p2 WHERE p1.f1 &> p2.f1;
|
||||
|
||||
-- Below polygon
|
||||
SELECT p1.f1, p2.f1 FROM POLYGON_TBL p1, POLYGON_TBL p2 WHERE p1.f1 <<| p2.f1;
|
||||
|
||||
-- Overlap or below polygon
|
||||
SELECT p1.f1, p2.f1 FROM POLYGON_TBL p1, POLYGON_TBL p2 WHERE p1.f1 &<| p2.f1;
|
||||
|
||||
-- Above polygon
|
||||
SELECT p1.f1, p2.f1 FROM POLYGON_TBL p1, POLYGON_TBL p2 WHERE p1.f1 |>> p2.f1;
|
||||
|
||||
-- Overlap or above polygon
|
||||
SELECT p1.f1, p2.f1 FROM POLYGON_TBL p1, POLYGON_TBL p2 WHERE p1.f1 |&> p2.f1;
|
||||
|
||||
-- Distance to polygon
|
||||
SELECT p1.f1, p2.f1, p1.f1 <-> p2.f1 FROM POLYGON_TBL p1, POLYGON_TBL p2;
|
||||
|
||||
--
|
||||
-- Circles
|
||||
@ -151,3 +412,96 @@ SELECT '' AS twentyfour, c1.f1 AS circle, p1.f1 AS point, (p1.f1 <-> c1.f1) AS d
|
||||
FROM CIRCLE_TBL c1, POINT_TBL p1
|
||||
WHERE (p1.f1 <-> c1.f1) > 0
|
||||
ORDER BY distance, area(c1.f1), p1.f1[0];
|
||||
|
||||
-- To polygon
|
||||
SELECT f1, f1::polygon FROM CIRCLE_TBL WHERE f1 >= '<(0,0),1>';
|
||||
|
||||
-- To polygon with less points
|
||||
SELECT f1, polygon(8, f1) FROM CIRCLE_TBL WHERE f1 >= '<(0,0),1>';
|
||||
|
||||
-- Too less points error
|
||||
SELECT f1, polygon(1, f1) FROM CIRCLE_TBL WHERE f1 >= '<(0,0),1>';
|
||||
|
||||
-- Zero radius error
|
||||
SELECT f1, polygon(10, f1) FROM CIRCLE_TBL WHERE f1 < '<(0,0),1>';
|
||||
|
||||
-- Same as circle
|
||||
SELECT c1.f1, c2.f1 FROM CIRCLE_TBL c1, CIRCLE_TBL c2 WHERE c1.f1 ~= c2.f1;
|
||||
|
||||
-- Overlap with circle
|
||||
SELECT c1.f1, c2.f1 FROM CIRCLE_TBL c1, CIRCLE_TBL c2 WHERE c1.f1 && c2.f1;
|
||||
|
||||
-- Overlap or left of circle
|
||||
SELECT c1.f1, c2.f1 FROM CIRCLE_TBL c1, CIRCLE_TBL c2 WHERE c1.f1 &< c2.f1;
|
||||
|
||||
-- Left of circle
|
||||
SELECT c1.f1, c2.f1 FROM CIRCLE_TBL c1, CIRCLE_TBL c2 WHERE c1.f1 << c2.f1;
|
||||
|
||||
-- Right of circle
|
||||
SELECT c1.f1, c2.f1 FROM CIRCLE_TBL c1, CIRCLE_TBL c2 WHERE c1.f1 >> c2.f1;
|
||||
|
||||
-- Overlap or right of circle
|
||||
SELECT c1.f1, c2.f1 FROM CIRCLE_TBL c1, CIRCLE_TBL c2 WHERE c1.f1 &> c2.f1;
|
||||
|
||||
-- Contained by circle
|
||||
SELECT c1.f1, c2.f1 FROM CIRCLE_TBL c1, CIRCLE_TBL c2 WHERE c1.f1 <@ c2.f1;
|
||||
|
||||
-- Contain by circle
|
||||
SELECT c1.f1, c2.f1 FROM CIRCLE_TBL c1, CIRCLE_TBL c2 WHERE c1.f1 @> c2.f1;
|
||||
|
||||
-- Below circle
|
||||
SELECT c1.f1, c2.f1 FROM CIRCLE_TBL c1, CIRCLE_TBL c2 WHERE c1.f1 <<| c2.f1;
|
||||
|
||||
-- Above circle
|
||||
SELECT c1.f1, c2.f1 FROM CIRCLE_TBL c1, CIRCLE_TBL c2 WHERE c1.f1 |>> c2.f1;
|
||||
|
||||
-- Overlap or below circle
|
||||
SELECT c1.f1, c2.f1 FROM CIRCLE_TBL c1, CIRCLE_TBL c2 WHERE c1.f1 &<| c2.f1;
|
||||
|
||||
-- Overlap or above circle
|
||||
SELECT c1.f1, c2.f1 FROM CIRCLE_TBL c1, CIRCLE_TBL c2 WHERE c1.f1 |&> c2.f1;
|
||||
|
||||
-- Area equal with circle
|
||||
SELECT c1.f1, c2.f1 FROM CIRCLE_TBL c1, CIRCLE_TBL c2 WHERE c1.f1 = c2.f1;
|
||||
|
||||
-- Area not equal with circle
|
||||
SELECT c1.f1, c2.f1 FROM CIRCLE_TBL c1, CIRCLE_TBL c2 WHERE c1.f1 != c2.f1;
|
||||
|
||||
-- Area less than circle
|
||||
SELECT c1.f1, c2.f1 FROM CIRCLE_TBL c1, CIRCLE_TBL c2 WHERE c1.f1 < c2.f1;
|
||||
|
||||
-- Area greater than circle
|
||||
SELECT c1.f1, c2.f1 FROM CIRCLE_TBL c1, CIRCLE_TBL c2 WHERE c1.f1 > c2.f1;
|
||||
|
||||
-- Area less than or equal circle
|
||||
SELECT c1.f1, c2.f1 FROM CIRCLE_TBL c1, CIRCLE_TBL c2 WHERE c1.f1 <= c2.f1;
|
||||
|
||||
-- Area greater than or equal circle
|
||||
SELECT c1.f1, c2.f1 FROM CIRCLE_TBL c1, CIRCLE_TBL c2 WHERE c1.f1 >= c2.f1;
|
||||
|
||||
-- Area less than circle
|
||||
SELECT c1.f1, c2.f1 FROM CIRCLE_TBL c1, CIRCLE_TBL c2 WHERE c1.f1 < c2.f1;
|
||||
|
||||
-- Area greater than circle
|
||||
SELECT c1.f1, c2.f1 FROM CIRCLE_TBL c1, CIRCLE_TBL c2 WHERE c1.f1 < c2.f1;
|
||||
|
||||
-- Add point
|
||||
SELECT c.f1, p.f1, c.f1 + p.f1 FROM CIRCLE_TBL c, POINT_TBL p;
|
||||
|
||||
-- Subtract point
|
||||
SELECT c.f1, p.f1, c.f1 - p.f1 FROM CIRCLE_TBL c, POINT_TBL p;
|
||||
|
||||
-- Multiply with point
|
||||
SELECT c.f1, p.f1, c.f1 * p.f1 FROM CIRCLE_TBL c, POINT_TBL p;
|
||||
|
||||
-- Divide by point
|
||||
SELECT c.f1, p.f1, c.f1 / p.f1 FROM CIRCLE_TBL c, POINT_TBL p WHERE p.f1[0] BETWEEN 1 AND 1000;
|
||||
|
||||
-- Overflow error
|
||||
SELECT c.f1, p.f1, c.f1 / p.f1 FROM CIRCLE_TBL c, POINT_TBL p WHERE p.f1[0] > 1000;
|
||||
|
||||
-- Division by 0 error
|
||||
SELECT c.f1, p.f1, c.f1 / p.f1 FROM CIRCLE_TBL c, POINT_TBL p WHERE p.f1 ~= '(0,0)'::point;
|
||||
|
||||
-- Distance to polygon
|
||||
SELECT c.f1, p.f1, c.f1 <-> p.f1 FROM CIRCLE_TBL c, POLYGON_TBL p;
|
||||
|
Reference in New Issue
Block a user