mirror of
https://git.postgresql.org/git/postgresql.git
synced 2025-01-06 15:24:56 +08:00
d16ebfbff7
If autovacuum comes along just after we fill table test_seg with
some data, it will update the stats to the point where we prefer
a plain indexscan over a bitmap scan, breaking the expected
output (as well as the point of the test case). To fix, just
force a bitmap scan to be chosen here.
This has evidently been wrong since commit de1d042f5
. It's not
clear why we just recently saw any buildfarm failures due to it;
but prairiedog has failed twice on this test in the past week.
Hence, backpatch to v11 where this test case came in.
238 lines
6.9 KiB
SQL
238 lines
6.9 KiB
SQL
--
|
|
-- Test seg datatype
|
|
--
|
|
|
|
CREATE EXTENSION seg;
|
|
|
|
-- Check whether any of our opclasses fail amvalidate
|
|
SELECT amname, opcname
|
|
FROM pg_opclass opc LEFT JOIN pg_am am ON am.oid = opcmethod
|
|
WHERE opc.oid >= 16384 AND NOT amvalidate(opc.oid);
|
|
|
|
--
|
|
-- testing the input and output functions
|
|
--
|
|
|
|
-- Any number
|
|
SELECT '1'::seg AS seg;
|
|
SELECT '-1'::seg AS seg;
|
|
SELECT '1.0'::seg AS seg;
|
|
SELECT '-1.0'::seg AS seg;
|
|
SELECT '1e7'::seg AS seg;
|
|
SELECT '-1e7'::seg AS seg;
|
|
SELECT '1.0e7'::seg AS seg;
|
|
SELECT '-1.0e7'::seg AS seg;
|
|
SELECT '1e+7'::seg AS seg;
|
|
SELECT '-1e+7'::seg AS seg;
|
|
SELECT '1.0e+7'::seg AS seg;
|
|
SELECT '-1.0e+7'::seg AS seg;
|
|
SELECT '1e-7'::seg AS seg;
|
|
SELECT '-1e-7'::seg AS seg;
|
|
SELECT '1.0e-7'::seg AS seg;
|
|
SELECT '-1.0e-7'::seg AS seg;
|
|
SELECT '2e-6'::seg AS seg;
|
|
SELECT '2e-5'::seg AS seg;
|
|
SELECT '2e-4'::seg AS seg;
|
|
SELECT '2e-3'::seg AS seg;
|
|
SELECT '2e-2'::seg AS seg;
|
|
SELECT '2e-1'::seg AS seg;
|
|
SELECT '2e-0'::seg AS seg;
|
|
SELECT '2e+0'::seg AS seg;
|
|
SELECT '2e+1'::seg AS seg;
|
|
SELECT '2e+2'::seg AS seg;
|
|
SELECT '2e+3'::seg AS seg;
|
|
SELECT '2e+4'::seg AS seg;
|
|
SELECT '2e+5'::seg AS seg;
|
|
SELECT '2e+6'::seg AS seg;
|
|
|
|
|
|
-- Significant digits preserved
|
|
SELECT '1'::seg AS seg;
|
|
SELECT '1.0'::seg AS seg;
|
|
SELECT '1.00'::seg AS seg;
|
|
SELECT '1.000'::seg AS seg;
|
|
SELECT '1.0000'::seg AS seg;
|
|
SELECT '1.00000'::seg AS seg;
|
|
SELECT '1.000000'::seg AS seg;
|
|
SELECT '0.000000120'::seg AS seg;
|
|
SELECT '3.400e5'::seg AS seg;
|
|
|
|
-- Digits truncated
|
|
SELECT '12.34567890123456'::seg AS seg;
|
|
|
|
-- Numbers with certainty indicators
|
|
SELECT '~6.5'::seg AS seg;
|
|
SELECT '<6.5'::seg AS seg;
|
|
SELECT '>6.5'::seg AS seg;
|
|
SELECT '~ 6.5'::seg AS seg;
|
|
SELECT '< 6.5'::seg AS seg;
|
|
SELECT '> 6.5'::seg AS seg;
|
|
|
|
-- Open intervals
|
|
SELECT '0..'::seg AS seg;
|
|
SELECT '0...'::seg AS seg;
|
|
SELECT '0 ..'::seg AS seg;
|
|
SELECT '0 ...'::seg AS seg;
|
|
SELECT '..0'::seg AS seg;
|
|
SELECT '...0'::seg AS seg;
|
|
SELECT '.. 0'::seg AS seg;
|
|
SELECT '... 0'::seg AS seg;
|
|
|
|
-- Finite intervals
|
|
SELECT '0 .. 1'::seg AS seg;
|
|
SELECT '-1 .. 0'::seg AS seg;
|
|
SELECT '-1 .. 1'::seg AS seg;
|
|
|
|
-- (+/-) intervals
|
|
SELECT '0(+-)1'::seg AS seg;
|
|
SELECT '0(+-)1.0'::seg AS seg;
|
|
SELECT '1.0(+-)0.005'::seg AS seg;
|
|
SELECT '101(+-)1'::seg AS seg;
|
|
-- incorrect number of significant digits in 99.0:
|
|
SELECT '100(+-)1'::seg AS seg;
|
|
|
|
-- invalid input
|
|
SELECT ''::seg AS seg;
|
|
SELECT 'ABC'::seg AS seg;
|
|
SELECT '1ABC'::seg AS seg;
|
|
SELECT '1.'::seg AS seg;
|
|
SELECT '1.....'::seg AS seg;
|
|
SELECT '.1'::seg AS seg;
|
|
SELECT '1..2.'::seg AS seg;
|
|
SELECT '1 e7'::seg AS seg;
|
|
SELECT '1e700'::seg AS seg;
|
|
|
|
--
|
|
-- testing the operators
|
|
--
|
|
|
|
-- equality/inequality:
|
|
--
|
|
SELECT '24 .. 33.20'::seg = '24 .. 33.20'::seg AS bool;
|
|
SELECT '24 .. 33.20'::seg = '24 .. 33.21'::seg AS bool;
|
|
SELECT '24 .. 33.20'::seg != '24 .. 33.20'::seg AS bool;
|
|
SELECT '24 .. 33.20'::seg != '24 .. 33.21'::seg AS bool;
|
|
|
|
-- overlap
|
|
--
|
|
SELECT '1'::seg && '1'::seg AS bool;
|
|
SELECT '1'::seg && '2'::seg AS bool;
|
|
SELECT '0 ..'::seg && '0 ..'::seg AS bool;
|
|
SELECT '0 .. 1'::seg && '0 .. 1'::seg AS bool;
|
|
SELECT '..0'::seg && '0..'::seg AS bool;
|
|
SELECT '-1 .. 0.1'::seg && '0 .. 1'::seg AS bool;
|
|
SELECT '-1 .. 0'::seg && '0 .. 1'::seg AS bool;
|
|
SELECT '-1 .. -0.0001'::seg && '0 .. 1'::seg AS bool;
|
|
SELECT '0 ..'::seg && '1'::seg AS bool;
|
|
SELECT '0 .. 1'::seg && '1'::seg AS bool;
|
|
SELECT '0 .. 1'::seg && '2'::seg AS bool;
|
|
SELECT '0 .. 2'::seg && '1'::seg AS bool;
|
|
SELECT '1'::seg && '0 .. 1'::seg AS bool;
|
|
SELECT '2'::seg && '0 .. 1'::seg AS bool;
|
|
SELECT '1'::seg && '0 .. 2'::seg AS bool;
|
|
|
|
-- overlap on the left
|
|
--
|
|
SELECT '1'::seg &< '0'::seg AS bool;
|
|
SELECT '1'::seg &< '1'::seg AS bool;
|
|
SELECT '1'::seg &< '2'::seg AS bool;
|
|
SELECT '0 .. 1'::seg &< '0'::seg AS bool;
|
|
SELECT '0 .. 1'::seg &< '1'::seg AS bool;
|
|
SELECT '0 .. 1'::seg &< '2'::seg AS bool;
|
|
SELECT '0 .. 1'::seg &< '0 .. 0.5'::seg AS bool;
|
|
SELECT '0 .. 1'::seg &< '0 .. 1'::seg AS bool;
|
|
SELECT '0 .. 1'::seg &< '0 .. 2'::seg AS bool;
|
|
SELECT '0 .. 1'::seg &< '1 .. 2'::seg AS bool;
|
|
SELECT '0 .. 1'::seg &< '2 .. 3'::seg AS bool;
|
|
|
|
-- overlap on the right
|
|
--
|
|
SELECT '0'::seg &> '1'::seg AS bool;
|
|
SELECT '1'::seg &> '1'::seg AS bool;
|
|
SELECT '2'::seg &> '1'::seg AS bool;
|
|
SELECT '0'::seg &> '0 .. 1'::seg AS bool;
|
|
SELECT '1'::seg &> '0 .. 1'::seg AS bool;
|
|
SELECT '2'::seg &> '0 .. 1'::seg AS bool;
|
|
SELECT '0 .. 0.5'::seg &> '0 .. 1'::seg AS bool;
|
|
SELECT '0 .. 1'::seg &> '0 .. 1'::seg AS bool;
|
|
SELECT '0 .. 2'::seg &> '0 .. 2'::seg AS bool;
|
|
SELECT '1 .. 2'::seg &> '0 .. 1'::seg AS bool;
|
|
SELECT '2 .. 3'::seg &> '0 .. 1'::seg AS bool;
|
|
|
|
-- left
|
|
--
|
|
SELECT '1'::seg << '0'::seg AS bool;
|
|
SELECT '1'::seg << '1'::seg AS bool;
|
|
SELECT '1'::seg << '2'::seg AS bool;
|
|
SELECT '0 .. 1'::seg << '0'::seg AS bool;
|
|
SELECT '0 .. 1'::seg << '1'::seg AS bool;
|
|
SELECT '0 .. 1'::seg << '2'::seg AS bool;
|
|
SELECT '0 .. 1'::seg << '0 .. 0.5'::seg AS bool;
|
|
SELECT '0 .. 1'::seg << '0 .. 1'::seg AS bool;
|
|
SELECT '0 .. 1'::seg << '0 .. 2'::seg AS bool;
|
|
SELECT '0 .. 1'::seg << '1 .. 2'::seg AS bool;
|
|
SELECT '0 .. 1'::seg << '2 .. 3'::seg AS bool;
|
|
|
|
-- right
|
|
--
|
|
SELECT '0'::seg >> '1'::seg AS bool;
|
|
SELECT '1'::seg >> '1'::seg AS bool;
|
|
SELECT '2'::seg >> '1'::seg AS bool;
|
|
SELECT '0'::seg >> '0 .. 1'::seg AS bool;
|
|
SELECT '1'::seg >> '0 .. 1'::seg AS bool;
|
|
SELECT '2'::seg >> '0 .. 1'::seg AS bool;
|
|
SELECT '0 .. 0.5'::seg >> '0 .. 1'::seg AS bool;
|
|
SELECT '0 .. 1'::seg >> '0 .. 1'::seg AS bool;
|
|
SELECT '0 .. 2'::seg >> '0 .. 2'::seg AS bool;
|
|
SELECT '1 .. 2'::seg >> '0 .. 1'::seg AS bool;
|
|
SELECT '2 .. 3'::seg >> '0 .. 1'::seg AS bool;
|
|
|
|
|
|
-- "contained in" (the left value belongs within the interval specified in the right value):
|
|
--
|
|
SELECT '0'::seg <@ '0'::seg AS bool;
|
|
SELECT '0'::seg <@ '0 ..'::seg AS bool;
|
|
SELECT '0'::seg <@ '.. 0'::seg AS bool;
|
|
SELECT '0'::seg <@ '-1 .. 1'::seg AS bool;
|
|
SELECT '0'::seg <@ '-1 .. 1'::seg AS bool;
|
|
SELECT '-1'::seg <@ '-1 .. 1'::seg AS bool;
|
|
SELECT '1'::seg <@ '-1 .. 1'::seg AS bool;
|
|
SELECT '-1 .. 1'::seg <@ '-1 .. 1'::seg AS bool;
|
|
|
|
-- "contains" (the left value contains the interval specified in the right value):
|
|
--
|
|
SELECT '0'::seg @> '0'::seg AS bool;
|
|
SELECT '0 .. '::seg <@ '0'::seg AS bool;
|
|
SELECT '.. 0'::seg <@ '0'::seg AS bool;
|
|
SELECT '-1 .. 1'::seg <@ '0'::seg AS bool;
|
|
SELECT '0'::seg <@ '-1 .. 1'::seg AS bool;
|
|
SELECT '-1'::seg <@ '-1 .. 1'::seg AS bool;
|
|
SELECT '1'::seg <@ '-1 .. 1'::seg AS bool;
|
|
|
|
-- Load some example data and build the index
|
|
--
|
|
CREATE TABLE test_seg (s seg);
|
|
|
|
\copy test_seg from 'data/test_seg.data'
|
|
|
|
CREATE INDEX test_seg_ix ON test_seg USING gist (s);
|
|
|
|
SET enable_indexscan = false;
|
|
EXPLAIN (COSTS OFF)
|
|
SELECT count(*) FROM test_seg WHERE s @> '11..11.3';
|
|
SELECT count(*) FROM test_seg WHERE s @> '11..11.3';
|
|
RESET enable_indexscan;
|
|
|
|
SET enable_bitmapscan = false;
|
|
EXPLAIN (COSTS OFF)
|
|
SELECT count(*) FROM test_seg WHERE s @> '11..11.3';
|
|
SELECT count(*) FROM test_seg WHERE s @> '11..11.3';
|
|
RESET enable_bitmapscan;
|
|
|
|
-- Test sorting
|
|
SELECT * FROM test_seg WHERE s @> '11..11.3' GROUP BY s;
|
|
|
|
-- Test functions
|
|
SELECT seg_lower(s), seg_center(s), seg_upper(s)
|
|
FROM test_seg WHERE s @> '11.2..11.3' OR s IS NULL ORDER BY s;
|