]> granicus.if.org Git - postgresql/blob - src/test/regress/expected/enum.out
Teach the system how to use hashing for UNION. (INTERSECT/EXCEPT will follow,
[postgresql] / src / test / regress / expected / enum.out
1 --
2 -- Enum tests
3 --
4 CREATE TYPE rainbow AS ENUM ('red', 'orange', 'yellow', 'green', 'blue', 'purple');
5 --
6 -- Did it create the right number of rows?
7 --
8 SELECT COUNT(*) FROM pg_enum WHERE enumtypid = 'rainbow'::regtype;
9  count 
10 -------
11      6
12 (1 row)
13
14 --
15 -- I/O functions
16 --
17 SELECT 'red'::rainbow;
18  rainbow 
19 ---------
20  red
21 (1 row)
22
23 SELECT 'mauve'::rainbow;
24 ERROR:  invalid input value for enum rainbow: "mauve"
25 --
26 -- Basic table creation, row selection
27 --
28 CREATE TABLE enumtest (col rainbow);
29 INSERT INTO enumtest values ('red'), ('orange'), ('yellow'), ('green');
30 COPY enumtest FROM stdin;
31 SELECT * FROM enumtest;
32   col   
33 --------
34  red
35  orange
36  yellow
37  green
38  blue
39  purple
40 (6 rows)
41
42 --
43 -- Operators, no index
44 --
45 SELECT * FROM enumtest WHERE col = 'orange';
46   col   
47 --------
48  orange
49 (1 row)
50
51 SELECT * FROM enumtest WHERE col <> 'orange' ORDER BY col;
52   col   
53 --------
54  red
55  yellow
56  green
57  blue
58  purple
59 (5 rows)
60
61 SELECT * FROM enumtest WHERE col > 'yellow' ORDER BY col;
62   col   
63 --------
64  green
65  blue
66  purple
67 (3 rows)
68
69 SELECT * FROM enumtest WHERE col >= 'yellow' ORDER BY col;
70   col   
71 --------
72  yellow
73  green
74  blue
75  purple
76 (4 rows)
77
78 SELECT * FROM enumtest WHERE col < 'green' ORDER BY col;
79   col   
80 --------
81  red
82  orange
83  yellow
84 (3 rows)
85
86 SELECT * FROM enumtest WHERE col <= 'green' ORDER BY col;
87   col   
88 --------
89  red
90  orange
91  yellow
92  green
93 (4 rows)
94
95 --
96 -- Cast to/from text
97 --
98 SELECT 'red'::rainbow::text || 'hithere';
99   ?column?  
100 ------------
101  redhithere
102 (1 row)
103
104 SELECT 'red'::text::rainbow = 'red'::rainbow;
105  ?column? 
106 ----------
107  t
108 (1 row)
109
110 --
111 -- Aggregates
112 --
113 SELECT min(col) FROM enumtest;
114  min 
115 -----
116  red
117 (1 row)
118
119 SELECT max(col) FROM enumtest;
120   max   
121 --------
122  purple
123 (1 row)
124
125 SELECT max(col) FROM enumtest WHERE col < 'green';
126   max   
127 --------
128  yellow
129 (1 row)
130
131 --
132 -- Index tests, force use of index
133 --
134 SET enable_seqscan = off;
135 SET enable_bitmapscan = off;
136 --
137 -- Btree index / opclass with the various operators
138 --
139 CREATE UNIQUE INDEX enumtest_btree ON enumtest USING btree (col);
140 SELECT * FROM enumtest WHERE col = 'orange';
141   col   
142 --------
143  orange
144 (1 row)
145
146 SELECT * FROM enumtest WHERE col <> 'orange' ORDER BY col;
147   col   
148 --------
149  red
150  yellow
151  green
152  blue
153  purple
154 (5 rows)
155
156 SELECT * FROM enumtest WHERE col > 'yellow' ORDER BY col;
157   col   
158 --------
159  green
160  blue
161  purple
162 (3 rows)
163
164 SELECT * FROM enumtest WHERE col >= 'yellow' ORDER BY col;
165   col   
166 --------
167  yellow
168  green
169  blue
170  purple
171 (4 rows)
172
173 SELECT * FROM enumtest WHERE col < 'green' ORDER BY col;
174   col   
175 --------
176  red
177  orange
178  yellow
179 (3 rows)
180
181 SELECT * FROM enumtest WHERE col <= 'green' ORDER BY col;
182   col   
183 --------
184  red
185  orange
186  yellow
187  green
188 (4 rows)
189
190 SELECT min(col) FROM enumtest;
191  min 
192 -----
193  red
194 (1 row)
195
196 SELECT max(col) FROM enumtest;
197   max   
198 --------
199  purple
200 (1 row)
201
202 SELECT max(col) FROM enumtest WHERE col < 'green';
203   max   
204 --------
205  yellow
206 (1 row)
207
208 DROP INDEX enumtest_btree;
209 --
210 -- Hash index / opclass with the = operator
211 --
212 CREATE INDEX enumtest_hash ON enumtest USING hash (col);
213 SELECT * FROM enumtest WHERE col = 'orange';
214   col   
215 --------
216  orange
217 (1 row)
218
219 DROP INDEX enumtest_hash;
220 --
221 -- End index tests
222 --
223 RESET enable_seqscan;
224 RESET enable_bitmapscan;
225 --
226 -- Domains over enums
227 --
228 CREATE DOMAIN rgb AS rainbow CHECK (VALUE IN ('red', 'green', 'blue'));
229 SELECT 'red'::rgb;
230  rgb 
231 -----
232  red
233 (1 row)
234
235 SELECT 'purple'::rgb;
236 ERROR:  value for domain rgb violates check constraint "rgb_check"
237 SELECT 'purple'::rainbow::rgb;
238 ERROR:  value for domain rgb violates check constraint "rgb_check"
239 DROP DOMAIN rgb;
240 --
241 -- Arrays
242 --
243 SELECT '{red,green,blue}'::rainbow[];
244      rainbow      
245 ------------------
246  {red,green,blue}
247 (1 row)
248
249 SELECT ('{red,green,blue}'::rainbow[])[2];
250  rainbow 
251 ---------
252  green
253 (1 row)
254
255 SELECT 'red' = ANY ('{red,green,blue}'::rainbow[]);
256  ?column? 
257 ----------
258  t
259 (1 row)
260
261 SELECT 'yellow' = ANY ('{red,green,blue}'::rainbow[]);
262  ?column? 
263 ----------
264  f
265 (1 row)
266
267 SELECT 'red' = ALL ('{red,green,blue}'::rainbow[]);
268  ?column? 
269 ----------
270  f
271 (1 row)
272
273 SELECT 'red' = ALL ('{red,red}'::rainbow[]);
274  ?column? 
275 ----------
276  t
277 (1 row)
278
279 --
280 -- Support functions
281 --
282 SELECT enum_first(NULL::rainbow);
283  enum_first 
284 ------------
285  red
286 (1 row)
287
288 SELECT enum_last('green'::rainbow);
289  enum_last 
290 -----------
291  purple
292 (1 row)
293
294 SELECT enum_range(NULL::rainbow);
295               enum_range               
296 ---------------------------------------
297  {red,orange,yellow,green,blue,purple}
298 (1 row)
299
300 SELECT enum_range('orange'::rainbow, 'green'::rainbow);
301       enum_range       
302 -----------------------
303  {orange,yellow,green}
304 (1 row)
305
306 SELECT enum_range(NULL, 'green'::rainbow);
307         enum_range         
308 ---------------------------
309  {red,orange,yellow,green}
310 (1 row)
311
312 SELECT enum_range('orange'::rainbow, NULL);
313             enum_range             
314 -----------------------------------
315  {orange,yellow,green,blue,purple}
316 (1 row)
317
318 SELECT enum_range(NULL::rainbow, NULL);
319               enum_range               
320 ---------------------------------------
321  {red,orange,yellow,green,blue,purple}
322 (1 row)
323
324 --
325 -- User functions, can't test perl/python etc here since may not be compiled.
326 --
327 CREATE FUNCTION echo_me(anyenum) RETURNS text AS $$
328 BEGIN
329 RETURN $1::text || 'omg';
330 END
331 $$ LANGUAGE plpgsql;
332 SELECT echo_me('red'::rainbow);
333  echo_me 
334 ---------
335  redomg
336 (1 row)
337
338 --
339 -- Concrete function should override generic one
340 --
341 CREATE FUNCTION echo_me(rainbow) RETURNS text AS $$
342 BEGIN
343 RETURN $1::text || 'wtf';
344 END
345 $$ LANGUAGE plpgsql;
346 SELECT echo_me('red'::rainbow);
347  echo_me 
348 ---------
349  redwtf
350 (1 row)
351
352 --
353 -- If we drop the original generic one, we don't have to qualify the type
354 -- anymore, since there's only one match
355 --
356 DROP FUNCTION echo_me(anyenum);
357 SELECT echo_me('red');
358  echo_me 
359 ---------
360  redwtf
361 (1 row)
362
363 DROP FUNCTION echo_me(rainbow);
364 --
365 -- RI triggers on enum types
366 --
367 CREATE TABLE enumtest_parent (id rainbow PRIMARY KEY);
368 NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "enumtest_parent_pkey" for table "enumtest_parent"
369 CREATE TABLE enumtest_child (parent rainbow REFERENCES enumtest_parent);
370 INSERT INTO enumtest_parent VALUES ('red');
371 INSERT INTO enumtest_child VALUES ('red');
372 INSERT INTO enumtest_child VALUES ('blue');  -- fail
373 ERROR:  insert or update on table "enumtest_child" violates foreign key constraint "enumtest_child_parent_fkey"
374 DETAIL:  Key (parent)=(blue) is not present in table "enumtest_parent".
375 DELETE FROM enumtest_parent;  -- fail
376 ERROR:  update or delete on table "enumtest_parent" violates foreign key constraint "enumtest_child_parent_fkey" on table "enumtest_child"
377 DETAIL:  Key (id)=(red) is still referenced from table "enumtest_child".
378 --
379 -- cross-type RI should fail
380 --
381 CREATE TYPE bogus AS ENUM('good', 'bad', 'ugly');
382 CREATE TABLE enumtest_bogus_child(parent bogus REFERENCES enumtest_parent);
383 ERROR:  foreign key constraint "enumtest_bogus_child_parent_fkey" cannot be implemented
384 DETAIL:  Key columns "parent" and "id" are of incompatible types: bogus and rainbow.
385 DROP TYPE bogus;
386 --
387 -- Cleanup
388 --
389 DROP TABLE enumtest_child;
390 DROP TABLE enumtest_parent;
391 DROP TABLE enumtest;
392 DROP TYPE rainbow;
393 --
394 -- Verify properly cleaned up
395 --
396 SELECT COUNT(*) FROM pg_type WHERE typname = 'rainbow';
397  count 
398 -------
399      0
400 (1 row)
401
402 SELECT * FROM pg_enum WHERE NOT EXISTS
403   (SELECT 1 FROM pg_type WHERE pg_type.oid = enumtypid);
404  enumtypid | enumlabel 
405 -----------+-----------
406 (0 rows)
407