mirror of
https://github.com/postgres/postgres.git
synced 2025-05-08 07:21:33 +03:00
Fix support for some operators (&<, &>, $<|, |&>) in box operator class
of SP-GiST. Bug exists since initial commit of box opclass for SP-GiST, so backpath to 9.6 Author: Nikita Glukhov with minor editorization of tests by me Reviewed-by: Kyotaro Horiguchi, Anastasia Lubennikova https://commitfest.postgresql.org/13/981/
This commit is contained in:
parent
09f8bb5b36
commit
a4d07d2e9d
@ -286,6 +286,14 @@ lower2D(RangeBox *range_box, Range *query)
|
|||||||
FPlt(range_box->right.low, query->low);
|
FPlt(range_box->right.low, query->low);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Can any range from range_box not extend to the right side of the query? */
|
||||||
|
static bool
|
||||||
|
overLower2D(RangeBox *range_box, Range *query)
|
||||||
|
{
|
||||||
|
return FPle(range_box->left.low, query->high) &&
|
||||||
|
FPle(range_box->right.low, query->high);
|
||||||
|
}
|
||||||
|
|
||||||
/* Can any range from range_box to be higher than this argument? */
|
/* Can any range from range_box to be higher than this argument? */
|
||||||
static bool
|
static bool
|
||||||
higher2D(RangeBox *range_box, Range *query)
|
higher2D(RangeBox *range_box, Range *query)
|
||||||
@ -294,6 +302,14 @@ higher2D(RangeBox *range_box, Range *query)
|
|||||||
FPgt(range_box->right.high, query->high);
|
FPgt(range_box->right.high, query->high);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Can any range from range_box not extend to the left side of the query? */
|
||||||
|
static bool
|
||||||
|
overHigher2D(RangeBox *range_box, Range *query)
|
||||||
|
{
|
||||||
|
return FPge(range_box->left.high, query->low) &&
|
||||||
|
FPge(range_box->right.high, query->low);
|
||||||
|
}
|
||||||
|
|
||||||
/* Can any rectangle from rect_box be left of this argument? */
|
/* Can any rectangle from rect_box be left of this argument? */
|
||||||
static bool
|
static bool
|
||||||
left4D(RectBox *rect_box, RangeBox *query)
|
left4D(RectBox *rect_box, RangeBox *query)
|
||||||
@ -305,7 +321,7 @@ left4D(RectBox *rect_box, RangeBox *query)
|
|||||||
static bool
|
static bool
|
||||||
overLeft4D(RectBox *rect_box, RangeBox *query)
|
overLeft4D(RectBox *rect_box, RangeBox *query)
|
||||||
{
|
{
|
||||||
return lower2D(&rect_box->range_box_x, &query->right);
|
return overLower2D(&rect_box->range_box_x, &query->left);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Can any rectangle from rect_box be right of this argument? */
|
/* Can any rectangle from rect_box be right of this argument? */
|
||||||
@ -319,7 +335,7 @@ right4D(RectBox *rect_box, RangeBox *query)
|
|||||||
static bool
|
static bool
|
||||||
overRight4D(RectBox *rect_box, RangeBox *query)
|
overRight4D(RectBox *rect_box, RangeBox *query)
|
||||||
{
|
{
|
||||||
return higher2D(&rect_box->range_box_x, &query->right);
|
return overHigher2D(&rect_box->range_box_x, &query->left);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Can any rectangle from rect_box be below of this argument? */
|
/* Can any rectangle from rect_box be below of this argument? */
|
||||||
@ -333,7 +349,7 @@ below4D(RectBox *rect_box, RangeBox *query)
|
|||||||
static bool
|
static bool
|
||||||
overBelow4D(RectBox *rect_box, RangeBox *query)
|
overBelow4D(RectBox *rect_box, RangeBox *query)
|
||||||
{
|
{
|
||||||
return lower2D(&rect_box->range_box_y, &query->left);
|
return overLower2D(&rect_box->range_box_y, &query->right);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Can any rectangle from rect_box be above of this argument? */
|
/* Can any rectangle from rect_box be above of this argument? */
|
||||||
@ -347,7 +363,7 @@ above4D(RectBox *rect_box, RangeBox *query)
|
|||||||
static bool
|
static bool
|
||||||
overAbove4D(RectBox *rect_box, RangeBox *query)
|
overAbove4D(RectBox *rect_box, RangeBox *query)
|
||||||
{
|
{
|
||||||
return higher2D(&rect_box->range_box_y, &query->right);
|
return overHigher2D(&rect_box->range_box_y, &query->right);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -455,3 +455,107 @@ EXPLAIN (COSTS OFF) SELECT * FROM box_temp WHERE f1 ~= '(20,20),(40,40)';
|
|||||||
|
|
||||||
RESET enable_seqscan;
|
RESET enable_seqscan;
|
||||||
DROP INDEX box_spgist;
|
DROP INDEX box_spgist;
|
||||||
|
--
|
||||||
|
-- Test the SP-GiST index on the larger volume of data
|
||||||
|
--
|
||||||
|
CREATE TABLE quad_box_tbl (b box);
|
||||||
|
INSERT INTO quad_box_tbl
|
||||||
|
SELECT box(point(x * 10, y * 10), point(x * 10 + 5, y * 10 + 5))
|
||||||
|
FROM generate_series(1, 100) x,
|
||||||
|
generate_series(1, 100) y;
|
||||||
|
-- insert repeating data to test allTheSame
|
||||||
|
INSERT INTO quad_box_tbl
|
||||||
|
SELECT '((200, 300),(210, 310))'
|
||||||
|
FROM generate_series(1, 1000);
|
||||||
|
INSERT INTO quad_box_tbl
|
||||||
|
VALUES
|
||||||
|
(NULL),
|
||||||
|
(NULL),
|
||||||
|
('((-infinity,-infinity),(infinity,infinity))'),
|
||||||
|
('((-infinity,100),(-infinity,500))'),
|
||||||
|
('((-infinity,-infinity),(700,infinity))');
|
||||||
|
CREATE INDEX quad_box_tbl_idx ON quad_box_tbl USING spgist(b);
|
||||||
|
SET enable_seqscan = OFF;
|
||||||
|
SET enable_indexscan = ON;
|
||||||
|
SET enable_bitmapscan = ON;
|
||||||
|
SELECT count(*) FROM quad_box_tbl WHERE b << box '((100,200),(300,500))';
|
||||||
|
count
|
||||||
|
-------
|
||||||
|
901
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
SELECT count(*) FROM quad_box_tbl WHERE b &< box '((100,200),(300,500))';
|
||||||
|
count
|
||||||
|
-------
|
||||||
|
3901
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
SELECT count(*) FROM quad_box_tbl WHERE b && box '((100,200),(300,500))';
|
||||||
|
count
|
||||||
|
-------
|
||||||
|
1653
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
SELECT count(*) FROM quad_box_tbl WHERE b &> box '((100,200),(300,500))';
|
||||||
|
count
|
||||||
|
-------
|
||||||
|
10100
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
SELECT count(*) FROM quad_box_tbl WHERE b >> box '((100,200),(300,500))';
|
||||||
|
count
|
||||||
|
-------
|
||||||
|
7000
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
SELECT count(*) FROM quad_box_tbl WHERE b >> box '((100,200),(300,500))';
|
||||||
|
count
|
||||||
|
-------
|
||||||
|
7000
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
SELECT count(*) FROM quad_box_tbl WHERE b <<| box '((100,200),(300,500))';
|
||||||
|
count
|
||||||
|
-------
|
||||||
|
1900
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
SELECT count(*) FROM quad_box_tbl WHERE b &<| box '((100,200),(300,500))';
|
||||||
|
count
|
||||||
|
-------
|
||||||
|
5901
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
SELECT count(*) FROM quad_box_tbl WHERE b |&> box '((100,200),(300,500))';
|
||||||
|
count
|
||||||
|
-------
|
||||||
|
9100
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
SELECT count(*) FROM quad_box_tbl WHERE b |>> box '((100,200),(300,500))';
|
||||||
|
count
|
||||||
|
-------
|
||||||
|
5000
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
SELECT count(*) FROM quad_box_tbl WHERE b @> box '((201,301),(202,303))';
|
||||||
|
count
|
||||||
|
-------
|
||||||
|
1003
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
SELECT count(*) FROM quad_box_tbl WHERE b <@ box '((100,200),(300,500))';
|
||||||
|
count
|
||||||
|
-------
|
||||||
|
1600
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
SELECT count(*) FROM quad_box_tbl WHERE b ~= box '((200,300),(205,305))';
|
||||||
|
count
|
||||||
|
-------
|
||||||
|
1
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
RESET enable_seqscan;
|
||||||
|
RESET enable_indexscan;
|
||||||
|
RESET enable_bitmapscan;
|
||||||
|
@ -143,6 +143,7 @@ pg_type|t
|
|||||||
pg_user_mapping|t
|
pg_user_mapping|t
|
||||||
point_tbl|t
|
point_tbl|t
|
||||||
polygon_tbl|t
|
polygon_tbl|t
|
||||||
|
quad_box_tbl|t
|
||||||
quad_point_tbl|t
|
quad_point_tbl|t
|
||||||
radix_text_tbl|t
|
radix_text_tbl|t
|
||||||
ramp|f
|
ramp|f
|
||||||
|
@ -179,3 +179,50 @@ EXPLAIN (COSTS OFF) SELECT * FROM box_temp WHERE f1 ~= '(20,20),(40,40)';
|
|||||||
RESET enable_seqscan;
|
RESET enable_seqscan;
|
||||||
|
|
||||||
DROP INDEX box_spgist;
|
DROP INDEX box_spgist;
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Test the SP-GiST index on the larger volume of data
|
||||||
|
--
|
||||||
|
CREATE TABLE quad_box_tbl (b box);
|
||||||
|
|
||||||
|
INSERT INTO quad_box_tbl
|
||||||
|
SELECT box(point(x * 10, y * 10), point(x * 10 + 5, y * 10 + 5))
|
||||||
|
FROM generate_series(1, 100) x,
|
||||||
|
generate_series(1, 100) y;
|
||||||
|
|
||||||
|
-- insert repeating data to test allTheSame
|
||||||
|
INSERT INTO quad_box_tbl
|
||||||
|
SELECT '((200, 300),(210, 310))'
|
||||||
|
FROM generate_series(1, 1000);
|
||||||
|
|
||||||
|
INSERT INTO quad_box_tbl
|
||||||
|
VALUES
|
||||||
|
(NULL),
|
||||||
|
(NULL),
|
||||||
|
('((-infinity,-infinity),(infinity,infinity))'),
|
||||||
|
('((-infinity,100),(-infinity,500))'),
|
||||||
|
('((-infinity,-infinity),(700,infinity))');
|
||||||
|
|
||||||
|
CREATE INDEX quad_box_tbl_idx ON quad_box_tbl USING spgist(b);
|
||||||
|
|
||||||
|
SET enable_seqscan = OFF;
|
||||||
|
SET enable_indexscan = ON;
|
||||||
|
SET enable_bitmapscan = ON;
|
||||||
|
|
||||||
|
SELECT count(*) FROM quad_box_tbl WHERE b << box '((100,200),(300,500))';
|
||||||
|
SELECT count(*) FROM quad_box_tbl WHERE b &< box '((100,200),(300,500))';
|
||||||
|
SELECT count(*) FROM quad_box_tbl WHERE b && box '((100,200),(300,500))';
|
||||||
|
SELECT count(*) FROM quad_box_tbl WHERE b &> box '((100,200),(300,500))';
|
||||||
|
SELECT count(*) FROM quad_box_tbl WHERE b >> box '((100,200),(300,500))';
|
||||||
|
SELECT count(*) FROM quad_box_tbl WHERE b >> box '((100,200),(300,500))';
|
||||||
|
SELECT count(*) FROM quad_box_tbl WHERE b <<| box '((100,200),(300,500))';
|
||||||
|
SELECT count(*) FROM quad_box_tbl WHERE b &<| box '((100,200),(300,500))';
|
||||||
|
SELECT count(*) FROM quad_box_tbl WHERE b |&> box '((100,200),(300,500))';
|
||||||
|
SELECT count(*) FROM quad_box_tbl WHERE b |>> box '((100,200),(300,500))';
|
||||||
|
SELECT count(*) FROM quad_box_tbl WHERE b @> box '((201,301),(202,303))';
|
||||||
|
SELECT count(*) FROM quad_box_tbl WHERE b <@ box '((100,200),(300,500))';
|
||||||
|
SELECT count(*) FROM quad_box_tbl WHERE b ~= box '((200,300),(205,305))';
|
||||||
|
|
||||||
|
RESET enable_seqscan;
|
||||||
|
RESET enable_indexscan;
|
||||||
|
RESET enable_bitmapscan;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user