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