mirror of
https://github.com/postgres/postgres.git
synced 2025-09-03 15:22:11 +03:00
Fixes for multirange selectivity estimation
* Fix enumeration of the multirange operators in calc_multirangesel() and calc_multirangesel() switches. * Add more regression tests for matching to empty ranges/multiranges. Reported-by: Alexander Lakhin Discussion: https://postgr.es/m/c5269c65-f967-77c5-ff7c-15e621c47f6a%40gmail.com Author: Alexander Korotkov Backpatch-through: 14, where multiranges were introduced
This commit is contained in:
@@ -2241,12 +2241,114 @@ analyze test_multirange_gist;
|
||||
SET enable_seqscan = t;
|
||||
SET enable_indexscan = f;
|
||||
SET enable_bitmapscan = f;
|
||||
select count(*) from test_multirange_gist where mr = '{}'::int4multirange;
|
||||
count
|
||||
-------
|
||||
500
|
||||
(1 row)
|
||||
|
||||
select count(*) from test_multirange_gist where mr @> 'empty'::int4range;
|
||||
count
|
||||
-------
|
||||
3700
|
||||
(1 row)
|
||||
|
||||
select count(*) from test_multirange_gist where mr && 'empty'::int4range;
|
||||
count
|
||||
-------
|
||||
0
|
||||
(1 row)
|
||||
|
||||
select count(*) from test_multirange_gist where mr <@ 'empty'::int4range;
|
||||
count
|
||||
-------
|
||||
500
|
||||
(1 row)
|
||||
|
||||
select count(*) from test_multirange_gist where mr << 'empty'::int4range;
|
||||
count
|
||||
-------
|
||||
0
|
||||
(1 row)
|
||||
|
||||
select count(*) from test_multirange_gist where mr >> 'empty'::int4range;
|
||||
count
|
||||
-------
|
||||
0
|
||||
(1 row)
|
||||
|
||||
select count(*) from test_multirange_gist where mr &< 'empty'::int4range;
|
||||
count
|
||||
-------
|
||||
0
|
||||
(1 row)
|
||||
|
||||
select count(*) from test_multirange_gist where mr &> 'empty'::int4range;
|
||||
count
|
||||
-------
|
||||
0
|
||||
(1 row)
|
||||
|
||||
select count(*) from test_multirange_gist where mr -|- 'empty'::int4range;
|
||||
count
|
||||
-------
|
||||
0
|
||||
(1 row)
|
||||
|
||||
select count(*) from test_multirange_gist where mr @> '{}'::int4multirange;
|
||||
count
|
||||
-------
|
||||
3700
|
||||
(1 row)
|
||||
|
||||
select count(*) from test_multirange_gist where mr @> '{}'::int4multirange;
|
||||
count
|
||||
-------
|
||||
3700
|
||||
(1 row)
|
||||
|
||||
select count(*) from test_multirange_gist where mr && '{}'::int4multirange;
|
||||
count
|
||||
-------
|
||||
0
|
||||
(1 row)
|
||||
|
||||
select count(*) from test_multirange_gist where mr <@ '{}'::int4multirange;
|
||||
count
|
||||
-------
|
||||
500
|
||||
(1 row)
|
||||
|
||||
select count(*) from test_multirange_gist where mr << '{}'::int4multirange;
|
||||
count
|
||||
-------
|
||||
0
|
||||
(1 row)
|
||||
|
||||
select count(*) from test_multirange_gist where mr >> '{}'::int4multirange;
|
||||
count
|
||||
-------
|
||||
0
|
||||
(1 row)
|
||||
|
||||
select count(*) from test_multirange_gist where mr &< '{}'::int4multirange;
|
||||
count
|
||||
-------
|
||||
0
|
||||
(1 row)
|
||||
|
||||
select count(*) from test_multirange_gist where mr &> '{}'::int4multirange;
|
||||
count
|
||||
-------
|
||||
0
|
||||
(1 row)
|
||||
|
||||
select count(*) from test_multirange_gist where mr -|- '{}'::int4multirange;
|
||||
count
|
||||
-------
|
||||
0
|
||||
(1 row)
|
||||
|
||||
select count(*) from test_multirange_gist where mr = int4multirange(int4range(10,20), int4range(30,40), int4range(50,60));
|
||||
count
|
||||
-------
|
||||
@@ -2365,6 +2467,114 @@ select count(*) from test_multirange_gist where mr -|- int4multirange(int4range(
|
||||
SET enable_seqscan = f;
|
||||
SET enable_indexscan = t;
|
||||
SET enable_bitmapscan = f;
|
||||
select count(*) from test_multirange_gist where mr = '{}'::int4multirange;
|
||||
count
|
||||
-------
|
||||
500
|
||||
(1 row)
|
||||
|
||||
select count(*) from test_multirange_gist where mr @> 'empty'::int4range;
|
||||
count
|
||||
-------
|
||||
3700
|
||||
(1 row)
|
||||
|
||||
select count(*) from test_multirange_gist where mr && 'empty'::int4range;
|
||||
count
|
||||
-------
|
||||
0
|
||||
(1 row)
|
||||
|
||||
select count(*) from test_multirange_gist where mr <@ 'empty'::int4range;
|
||||
count
|
||||
-------
|
||||
500
|
||||
(1 row)
|
||||
|
||||
select count(*) from test_multirange_gist where mr << 'empty'::int4range;
|
||||
count
|
||||
-------
|
||||
0
|
||||
(1 row)
|
||||
|
||||
select count(*) from test_multirange_gist where mr >> 'empty'::int4range;
|
||||
count
|
||||
-------
|
||||
0
|
||||
(1 row)
|
||||
|
||||
select count(*) from test_multirange_gist where mr &< 'empty'::int4range;
|
||||
count
|
||||
-------
|
||||
0
|
||||
(1 row)
|
||||
|
||||
select count(*) from test_multirange_gist where mr &> 'empty'::int4range;
|
||||
count
|
||||
-------
|
||||
0
|
||||
(1 row)
|
||||
|
||||
select count(*) from test_multirange_gist where mr -|- 'empty'::int4range;
|
||||
count
|
||||
-------
|
||||
0
|
||||
(1 row)
|
||||
|
||||
select count(*) from test_multirange_gist where mr @> '{}'::int4multirange;
|
||||
count
|
||||
-------
|
||||
3700
|
||||
(1 row)
|
||||
|
||||
select count(*) from test_multirange_gist where mr @> '{}'::int4multirange;
|
||||
count
|
||||
-------
|
||||
3700
|
||||
(1 row)
|
||||
|
||||
select count(*) from test_multirange_gist where mr && '{}'::int4multirange;
|
||||
count
|
||||
-------
|
||||
0
|
||||
(1 row)
|
||||
|
||||
select count(*) from test_multirange_gist where mr <@ '{}'::int4multirange;
|
||||
count
|
||||
-------
|
||||
500
|
||||
(1 row)
|
||||
|
||||
select count(*) from test_multirange_gist where mr << '{}'::int4multirange;
|
||||
count
|
||||
-------
|
||||
0
|
||||
(1 row)
|
||||
|
||||
select count(*) from test_multirange_gist where mr >> '{}'::int4multirange;
|
||||
count
|
||||
-------
|
||||
0
|
||||
(1 row)
|
||||
|
||||
select count(*) from test_multirange_gist where mr &< '{}'::int4multirange;
|
||||
count
|
||||
-------
|
||||
0
|
||||
(1 row)
|
||||
|
||||
select count(*) from test_multirange_gist where mr &> '{}'::int4multirange;
|
||||
count
|
||||
-------
|
||||
0
|
||||
(1 row)
|
||||
|
||||
select count(*) from test_multirange_gist where mr -|- '{}'::int4multirange;
|
||||
count
|
||||
-------
|
||||
0
|
||||
(1 row)
|
||||
|
||||
select count(*) from test_multirange_gist where mr @> 'empty'::int4range;
|
||||
count
|
||||
-------
|
||||
|
@@ -435,7 +435,25 @@ SET enable_seqscan = t;
|
||||
SET enable_indexscan = f;
|
||||
SET enable_bitmapscan = f;
|
||||
|
||||
select count(*) from test_multirange_gist where mr = '{}'::int4multirange;
|
||||
select count(*) from test_multirange_gist where mr @> 'empty'::int4range;
|
||||
select count(*) from test_multirange_gist where mr && 'empty'::int4range;
|
||||
select count(*) from test_multirange_gist where mr <@ 'empty'::int4range;
|
||||
select count(*) from test_multirange_gist where mr << 'empty'::int4range;
|
||||
select count(*) from test_multirange_gist where mr >> 'empty'::int4range;
|
||||
select count(*) from test_multirange_gist where mr &< 'empty'::int4range;
|
||||
select count(*) from test_multirange_gist where mr &> 'empty'::int4range;
|
||||
select count(*) from test_multirange_gist where mr -|- 'empty'::int4range;
|
||||
select count(*) from test_multirange_gist where mr @> '{}'::int4multirange;
|
||||
select count(*) from test_multirange_gist where mr @> '{}'::int4multirange;
|
||||
select count(*) from test_multirange_gist where mr && '{}'::int4multirange;
|
||||
select count(*) from test_multirange_gist where mr <@ '{}'::int4multirange;
|
||||
select count(*) from test_multirange_gist where mr << '{}'::int4multirange;
|
||||
select count(*) from test_multirange_gist where mr >> '{}'::int4multirange;
|
||||
select count(*) from test_multirange_gist where mr &< '{}'::int4multirange;
|
||||
select count(*) from test_multirange_gist where mr &> '{}'::int4multirange;
|
||||
select count(*) from test_multirange_gist where mr -|- '{}'::int4multirange;
|
||||
|
||||
select count(*) from test_multirange_gist where mr = int4multirange(int4range(10,20), int4range(30,40), int4range(50,60));
|
||||
select count(*) from test_multirange_gist where mr @> 10;
|
||||
select count(*) from test_multirange_gist where mr @> int4range(10,20);
|
||||
@@ -461,6 +479,25 @@ SET enable_seqscan = f;
|
||||
SET enable_indexscan = t;
|
||||
SET enable_bitmapscan = f;
|
||||
|
||||
select count(*) from test_multirange_gist where mr = '{}'::int4multirange;
|
||||
select count(*) from test_multirange_gist where mr @> 'empty'::int4range;
|
||||
select count(*) from test_multirange_gist where mr && 'empty'::int4range;
|
||||
select count(*) from test_multirange_gist where mr <@ 'empty'::int4range;
|
||||
select count(*) from test_multirange_gist where mr << 'empty'::int4range;
|
||||
select count(*) from test_multirange_gist where mr >> 'empty'::int4range;
|
||||
select count(*) from test_multirange_gist where mr &< 'empty'::int4range;
|
||||
select count(*) from test_multirange_gist where mr &> 'empty'::int4range;
|
||||
select count(*) from test_multirange_gist where mr -|- 'empty'::int4range;
|
||||
select count(*) from test_multirange_gist where mr @> '{}'::int4multirange;
|
||||
select count(*) from test_multirange_gist where mr @> '{}'::int4multirange;
|
||||
select count(*) from test_multirange_gist where mr && '{}'::int4multirange;
|
||||
select count(*) from test_multirange_gist where mr <@ '{}'::int4multirange;
|
||||
select count(*) from test_multirange_gist where mr << '{}'::int4multirange;
|
||||
select count(*) from test_multirange_gist where mr >> '{}'::int4multirange;
|
||||
select count(*) from test_multirange_gist where mr &< '{}'::int4multirange;
|
||||
select count(*) from test_multirange_gist where mr &> '{}'::int4multirange;
|
||||
select count(*) from test_multirange_gist where mr -|- '{}'::int4multirange;
|
||||
|
||||
select count(*) from test_multirange_gist where mr @> 'empty'::int4range;
|
||||
select count(*) from test_multirange_gist where mr = int4multirange(int4range(10,20), int4range(30,40), int4range(50,60));
|
||||
select count(*) from test_multirange_gist where mr @> 10;
|
||||
|
Reference in New Issue
Block a user