]> granicus.if.org Git - postgresql/blob - contrib/seg/sql/seg.sql
Modify the float4 datatype to be pass-by-val. Along the way, remove the last
[postgresql] / contrib / seg / sql / seg.sql
1 --
2 --  Test seg datatype
3 --
4
5 --
6 -- first, define the datatype.  Turn off echoing so that expected file
7 -- does not depend on contents of seg.sql.
8 --
9 SET client_min_messages = warning;
10 \set ECHO none
11 \i seg.sql
12 \set ECHO all
13 RESET client_min_messages;
14
15 --
16 -- testing the input and output functions
17 --
18
19 -- Any number
20 SELECT '1'::seg AS seg;
21 SELECT '-1'::seg AS seg;
22 SELECT '1.0'::seg AS seg;
23 SELECT '-1.0'::seg AS seg;
24 SELECT '1e7'::seg AS seg;
25 SELECT '-1e7'::seg AS seg;
26 SELECT '1.0e7'::seg AS seg;
27 SELECT '-1.0e7'::seg AS seg;
28 SELECT '1e+7'::seg AS seg;
29 SELECT '-1e+7'::seg AS seg;
30 SELECT '1.0e+7'::seg AS seg;
31 SELECT '-1.0e+7'::seg AS seg;
32 SELECT '1e-7'::seg AS seg;
33 SELECT '-1e-7'::seg AS seg;
34 SELECT '1.0e-7'::seg AS seg;
35 SELECT '-1.0e-7'::seg AS seg;
36 SELECT '2e-6'::seg AS seg;
37 SELECT '2e-5'::seg AS seg;
38 SELECT '2e-4'::seg AS seg;
39 SELECT '2e-3'::seg AS seg;
40 SELECT '2e-2'::seg AS seg;
41 SELECT '2e-1'::seg AS seg;
42 SELECT '2e-0'::seg AS seg;
43 SELECT '2e+0'::seg AS seg;
44 SELECT '2e+1'::seg AS seg;
45 SELECT '2e+2'::seg AS seg;
46 SELECT '2e+3'::seg AS seg;
47 SELECT '2e+4'::seg AS seg;
48 SELECT '2e+5'::seg AS seg;
49 SELECT '2e+6'::seg AS seg;
50
51
52 -- Significant digits preserved
53 SELECT '1'::seg AS seg;
54 SELECT '1.0'::seg AS seg;
55 SELECT '1.00'::seg AS seg;
56 SELECT '1.000'::seg AS seg;
57 SELECT '1.0000'::seg AS seg;
58 SELECT '1.00000'::seg AS seg;
59 SELECT '1.000000'::seg AS seg;
60 SELECT '0.000000120'::seg AS seg;
61 SELECT '3.400e5'::seg AS seg;
62
63 -- Digits truncated
64 SELECT '12.34567890123456'::seg AS seg;
65
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;
73
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;
83
84 -- Finite intervals
85 SELECT '0 .. 1'::seg AS seg;
86 SELECT '-1 .. 0'::seg AS seg;
87 SELECT '-1 .. 1'::seg AS seg;
88
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;
96
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;
107
108 --
109 -- testing the  operators
110 --
111
112 -- equality/inequality:
113 --
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;
118
119 -- overlap
120 --
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;
136
137 -- overlap on the left
138 --
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;
150
151 -- overlap on the right
152 --
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;
164
165 -- left
166 --
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;
178
179 -- right
180 --
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;
192
193
194 -- "contained in" (the left value belongs within the interval specified in the right value):
195 --
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;
204
205 -- "contains" (the left value contains the interval specified in the right value):
206 --
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;
214
215 -- Load some example data and build the index
216 -- 
217 CREATE TABLE test_seg (s seg);
218
219 \copy test_seg from 'data/test_seg.data'
220
221 CREATE INDEX test_seg_ix ON test_seg USING gist (s);
222 SELECT count(*) FROM test_seg WHERE s @> '11..11.3';
223
224 -- Test sorting 
225 SELECT * FROM test_seg WHERE s @> '11..11.3' GROUP BY s;
226
227 -- Test functions
228 SELECT seg_lower(s), seg_center(s), seg_upper(s)
229 FROM test_seg WHERE s @> '11.2..11.3' OR s IS NULL ORDER BY s;