pg_stat_statements: Avoid some locking during PGSS entry scans
[pgsql.git] / contrib / seg / sql / seg.sql
blobc30f1f6bef10d81d2cb4b08891a00eb5cd3f11d2
1 --
2 --  Test seg datatype
3 --
5 CREATE EXTENSION seg;
7 -- Check whether any of our opclasses fail amvalidate
8 SELECT amname, opcname
9 FROM pg_opclass opc LEFT JOIN pg_am am ON am.oid = opcmethod
10 WHERE opc.oid >= 16384 AND NOT amvalidate(opc.oid);
13 -- testing the input and output functions
16 -- Any number
17 SELECT '1'::seg AS seg;
18 SELECT '-1'::seg AS seg;
19 SELECT '1.0'::seg AS seg;
20 SELECT '-1.0'::seg AS seg;
21 SELECT '1e7'::seg AS seg;
22 SELECT '-1e7'::seg AS seg;
23 SELECT '1.0e7'::seg AS seg;
24 SELECT '-1.0e7'::seg AS seg;
25 SELECT '1e+7'::seg AS seg;
26 SELECT '-1e+7'::seg AS seg;
27 SELECT '1.0e+7'::seg AS seg;
28 SELECT '-1.0e+7'::seg AS seg;
29 SELECT '1e-7'::seg AS seg;
30 SELECT '-1e-7'::seg AS seg;
31 SELECT '1.0e-7'::seg AS seg;
32 SELECT '-1.0e-7'::seg AS seg;
33 SELECT '2e-6'::seg AS seg;
34 SELECT '2e-5'::seg AS seg;
35 SELECT '2e-4'::seg AS seg;
36 SELECT '2e-3'::seg AS seg;
37 SELECT '2e-2'::seg AS seg;
38 SELECT '2e-1'::seg AS seg;
39 SELECT '2e-0'::seg AS seg;
40 SELECT '2e+0'::seg AS seg;
41 SELECT '2e+1'::seg AS seg;
42 SELECT '2e+2'::seg AS seg;
43 SELECT '2e+3'::seg AS seg;
44 SELECT '2e+4'::seg AS seg;
45 SELECT '2e+5'::seg AS seg;
46 SELECT '2e+6'::seg AS seg;
49 -- Significant digits preserved
50 SELECT '1'::seg AS seg;
51 SELECT '1.0'::seg AS seg;
52 SELECT '1.00'::seg AS seg;
53 SELECT '1.000'::seg AS seg;
54 SELECT '1.0000'::seg AS seg;
55 SELECT '1.00000'::seg AS seg;
56 SELECT '1.000000'::seg AS seg;
57 SELECT '0.000000120'::seg AS seg;
58 SELECT '3.400e5'::seg AS seg;
60 -- Digits truncated
61 SELECT '12.34567890123456'::seg AS seg;
63 -- Same, with a very long input
64 SELECT '12.3456789012345600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'::seg AS seg;
66 -- Numbers with certainty indicators
67 SELECT '~6.5'::seg AS seg;
68 SELECT '<6.5'::seg AS seg;
69 SELECT '>6.5'::seg AS seg;
70 SELECT '~ 6.5'::seg AS seg;
71 SELECT '< 6.5'::seg AS seg;
72 SELECT '> 6.5'::seg AS seg;
74 -- Open intervals
75 SELECT '0..'::seg AS seg;
76 SELECT '0...'::seg AS seg;
77 SELECT '0 ..'::seg AS seg;
78 SELECT '0 ...'::seg AS seg;
79 SELECT '..0'::seg AS seg;
80 SELECT '...0'::seg AS seg;
81 SELECT '.. 0'::seg AS seg;
82 SELECT '... 0'::seg AS seg;
84 -- Finite intervals
85 SELECT '0 .. 1'::seg AS seg;
86 SELECT '-1 .. 0'::seg AS seg;
87 SELECT '-1 .. 1'::seg AS seg;
89 -- (+/-) intervals
90 SELECT '0(+-)1'::seg AS seg;
91 SELECT '0(+-)1.0'::seg AS seg;
92 SELECT '1.0(+-)0.005'::seg AS seg;
93 SELECT '101(+-)1'::seg AS seg;
94 -- incorrect number of significant digits in 99.0:
95 SELECT '100(+-)1'::seg AS seg;
97 -- invalid input
98 SELECT ''::seg AS seg;
99 SELECT 'ABC'::seg AS seg;
100 SELECT '1ABC'::seg AS seg;
101 SELECT '1.'::seg AS seg;
102 SELECT '1.....'::seg AS seg;
103 SELECT '.1'::seg AS seg;
104 SELECT '1..2.'::seg AS seg;
105 SELECT '1 e7'::seg AS seg;
106 SELECT '1e700'::seg AS seg;
109 -- testing the  operators
112 -- equality/inequality:
114 SELECT '24 .. 33.20'::seg = '24 .. 33.20'::seg AS bool;
115 SELECT '24 .. 33.20'::seg = '24 .. 33.21'::seg AS bool;
116 SELECT '24 .. 33.20'::seg != '24 .. 33.20'::seg AS bool;
117 SELECT '24 .. 33.20'::seg != '24 .. 33.21'::seg AS bool;
119 -- overlap
121 SELECT '1'::seg && '1'::seg AS bool;
122 SELECT '1'::seg && '2'::seg AS bool;
123 SELECT '0 ..'::seg && '0 ..'::seg AS bool;
124 SELECT '0 .. 1'::seg && '0 .. 1'::seg AS bool;
125 SELECT '..0'::seg && '0..'::seg AS bool;
126 SELECT '-1 .. 0.1'::seg && '0 .. 1'::seg AS bool;
127 SELECT '-1 .. 0'::seg && '0 .. 1'::seg AS bool;
128 SELECT '-1 .. -0.0001'::seg && '0 .. 1'::seg AS bool;
129 SELECT '0 ..'::seg && '1'::seg AS bool;
130 SELECT '0 .. 1'::seg && '1'::seg AS bool;
131 SELECT '0 .. 1'::seg && '2'::seg AS bool;
132 SELECT '0 .. 2'::seg && '1'::seg AS bool;
133 SELECT '1'::seg && '0 .. 1'::seg AS bool;
134 SELECT '2'::seg && '0 .. 1'::seg AS bool;
135 SELECT '1'::seg && '0 .. 2'::seg AS bool;
137 -- overlap on the left
139 SELECT '1'::seg &< '0'::seg AS bool;
140 SELECT '1'::seg &< '1'::seg AS bool;
141 SELECT '1'::seg &< '2'::seg AS bool;
142 SELECT '0 .. 1'::seg &< '0'::seg AS bool;
143 SELECT '0 .. 1'::seg &< '1'::seg AS bool;
144 SELECT '0 .. 1'::seg &< '2'::seg AS bool;
145 SELECT '0 .. 1'::seg &< '0 .. 0.5'::seg AS bool;
146 SELECT '0 .. 1'::seg &< '0 .. 1'::seg AS bool;
147 SELECT '0 .. 1'::seg &< '0 .. 2'::seg AS bool;
148 SELECT '0 .. 1'::seg &< '1 .. 2'::seg AS bool;
149 SELECT '0 .. 1'::seg &< '2 .. 3'::seg AS bool;
151 -- overlap on the right
153 SELECT '0'::seg &> '1'::seg AS bool;
154 SELECT '1'::seg &> '1'::seg AS bool;
155 SELECT '2'::seg &> '1'::seg AS bool;
156 SELECT '0'::seg &> '0 .. 1'::seg AS bool;
157 SELECT '1'::seg &> '0 .. 1'::seg AS bool;
158 SELECT '2'::seg &> '0 .. 1'::seg AS bool;
159 SELECT '0 .. 0.5'::seg &> '0 .. 1'::seg AS bool;
160 SELECT '0 .. 1'::seg &> '0 .. 1'::seg AS bool;
161 SELECT '0 .. 2'::seg &> '0 .. 2'::seg AS bool;
162 SELECT '1 .. 2'::seg &> '0 .. 1'::seg AS bool;
163 SELECT '2 .. 3'::seg &> '0 .. 1'::seg AS bool;
165 -- left
167 SELECT '1'::seg << '0'::seg AS bool;
168 SELECT '1'::seg << '1'::seg AS bool;
169 SELECT '1'::seg << '2'::seg AS bool;
170 SELECT '0 .. 1'::seg << '0'::seg AS bool;
171 SELECT '0 .. 1'::seg << '1'::seg AS bool;
172 SELECT '0 .. 1'::seg << '2'::seg AS bool;
173 SELECT '0 .. 1'::seg << '0 .. 0.5'::seg AS bool;
174 SELECT '0 .. 1'::seg << '0 .. 1'::seg AS bool;
175 SELECT '0 .. 1'::seg << '0 .. 2'::seg AS bool;
176 SELECT '0 .. 1'::seg << '1 .. 2'::seg AS bool;
177 SELECT '0 .. 1'::seg << '2 .. 3'::seg AS bool;
179 -- right
181 SELECT '0'::seg >> '1'::seg AS bool;
182 SELECT '1'::seg >> '1'::seg AS bool;
183 SELECT '2'::seg >> '1'::seg AS bool;
184 SELECT '0'::seg >> '0 .. 1'::seg AS bool;
185 SELECT '1'::seg >> '0 .. 1'::seg AS bool;
186 SELECT '2'::seg >> '0 .. 1'::seg AS bool;
187 SELECT '0 .. 0.5'::seg >> '0 .. 1'::seg AS bool;
188 SELECT '0 .. 1'::seg >> '0 .. 1'::seg AS bool;
189 SELECT '0 .. 2'::seg >> '0 .. 2'::seg AS bool;
190 SELECT '1 .. 2'::seg >> '0 .. 1'::seg AS bool;
191 SELECT '2 .. 3'::seg >> '0 .. 1'::seg AS bool;
194 -- "contained in" (the left value belongs within the interval specified in the right value):
196 SELECT '0'::seg        <@ '0'::seg AS bool;
197 SELECT '0'::seg        <@ '0 ..'::seg AS bool;
198 SELECT '0'::seg        <@ '.. 0'::seg AS bool;
199 SELECT '0'::seg        <@ '-1 .. 1'::seg AS bool;
200 SELECT '0'::seg        <@ '-1 .. 1'::seg AS bool;
201 SELECT '-1'::seg       <@ '-1 .. 1'::seg AS bool;
202 SELECT '1'::seg        <@ '-1 .. 1'::seg AS bool;
203 SELECT '-1 .. 1'::seg  <@ '-1 .. 1'::seg AS bool;
205 -- "contains" (the left value contains the interval specified in the right value):
207 SELECT '0'::seg @> '0'::seg AS bool;
208 SELECT '0 .. '::seg <@ '0'::seg AS bool;
209 SELECT '.. 0'::seg <@ '0'::seg AS bool;
210 SELECT '-1 .. 1'::seg <@ '0'::seg AS bool;
211 SELECT '0'::seg <@ '-1 .. 1'::seg AS bool;
212 SELECT '-1'::seg <@ '-1 .. 1'::seg AS bool;
213 SELECT '1'::seg <@ '-1 .. 1'::seg AS bool;
215 -- Load some example data and build the index
217 CREATE TABLE test_seg (s seg);
219 \copy test_seg from 'data/test_seg.data'
221 CREATE INDEX test_seg_ix ON test_seg USING gist (s);
223 SET enable_indexscan = false;
224 EXPLAIN (COSTS OFF)
225 SELECT count(*) FROM test_seg WHERE s @> '11..11.3';
226 SELECT count(*) FROM test_seg WHERE s @> '11..11.3';
227 RESET enable_indexscan;
229 SET enable_bitmapscan = false;
230 EXPLAIN (COSTS OFF)
231 SELECT count(*) FROM test_seg WHERE s @> '11..11.3';
232 SELECT count(*) FROM test_seg WHERE s @> '11..11.3';
233 RESET enable_bitmapscan;
235 -- Test sorting
236 SELECT * FROM test_seg WHERE s @> '11..11.3' GROUP BY s;
238 -- Test functions
239 SELECT seg_lower(s), seg_center(s), seg_upper(s)
240 FROM test_seg WHERE s @> '11.2..11.3' OR s IS NULL ORDER BY s;
243 -- test non error throwing API
245 SELECT str as seg,
246        pg_input_is_valid(str,'seg') as ok,
247        errinfo.sql_error_code,
248        errinfo.message,
249        errinfo.detail,
250        errinfo.hint
251 FROM unnest(ARRAY['-1 .. 1'::text,
252                   '100(+-)1',
253                   '',
254                   'ABC',
255                   '1 e7',
256                   '1e700']) str,
257      LATERAL pg_input_error_info(str, 'seg') as errinfo;