Fix pg_dump bug in the database-level collation patch. "datcollate" and
[PostgreSQL.git] / src / test / regress / sql / enum.sql
blob387e8e72ed8f8e9af85bd7430f9fbfde369a0e3e
1 --
2 -- Enum tests
3 --
5 CREATE TYPE rainbow AS ENUM ('red', 'orange', 'yellow', 'green', 'blue', 'purple');
7 --
8 -- Did it create the right number of rows?
9 --
10 SELECT COUNT(*) FROM pg_enum WHERE enumtypid = 'rainbow'::regtype;
13 -- I/O functions
15 SELECT 'red'::rainbow;
16 SELECT 'mauve'::rainbow;
19 -- Basic table creation, row selection
21 CREATE TABLE enumtest (col rainbow);
22 INSERT INTO enumtest values ('red'), ('orange'), ('yellow'), ('green');
23 COPY enumtest FROM stdin;
24 blue
25 purple
27 SELECT * FROM enumtest;
30 -- Operators, no index
32 SELECT * FROM enumtest WHERE col = 'orange';
33 SELECT * FROM enumtest WHERE col <> 'orange' ORDER BY col;
34 SELECT * FROM enumtest WHERE col > 'yellow' ORDER BY col;
35 SELECT * FROM enumtest WHERE col >= 'yellow' ORDER BY col;
36 SELECT * FROM enumtest WHERE col < 'green' ORDER BY col;
37 SELECT * FROM enumtest WHERE col <= 'green' ORDER BY col;
40 -- Cast to/from text
42 SELECT 'red'::rainbow::text || 'hithere';
43 SELECT 'red'::text::rainbow = 'red'::rainbow;
46 -- Aggregates
48 SELECT min(col) FROM enumtest;
49 SELECT max(col) FROM enumtest;
50 SELECT max(col) FROM enumtest WHERE col < 'green';
53 -- Index tests, force use of index
55 SET enable_seqscan = off;
56 SET enable_bitmapscan = off;
59 -- Btree index / opclass with the various operators
61 CREATE UNIQUE INDEX enumtest_btree ON enumtest USING btree (col);
62 SELECT * FROM enumtest WHERE col = 'orange';
63 SELECT * FROM enumtest WHERE col <> 'orange' ORDER BY col;
64 SELECT * FROM enumtest WHERE col > 'yellow' ORDER BY col;
65 SELECT * FROM enumtest WHERE col >= 'yellow' ORDER BY col;
66 SELECT * FROM enumtest WHERE col < 'green' ORDER BY col;
67 SELECT * FROM enumtest WHERE col <= 'green' ORDER BY col;
68 SELECT min(col) FROM enumtest;
69 SELECT max(col) FROM enumtest;
70 SELECT max(col) FROM enumtest WHERE col < 'green';
71 DROP INDEX enumtest_btree;
74 -- Hash index / opclass with the = operator
76 CREATE INDEX enumtest_hash ON enumtest USING hash (col);
77 SELECT * FROM enumtest WHERE col = 'orange';
78 DROP INDEX enumtest_hash;
81 -- End index tests
83 RESET enable_seqscan;
84 RESET enable_bitmapscan;
87 -- Domains over enums
89 CREATE DOMAIN rgb AS rainbow CHECK (VALUE IN ('red', 'green', 'blue'));
90 SELECT 'red'::rgb;
91 SELECT 'purple'::rgb;
92 SELECT 'purple'::rainbow::rgb;
93 DROP DOMAIN rgb;
96 -- Arrays
98 SELECT '{red,green,blue}'::rainbow[];
99 SELECT ('{red,green,blue}'::rainbow[])[2];
100 SELECT 'red' = ANY ('{red,green,blue}'::rainbow[]);
101 SELECT 'yellow' = ANY ('{red,green,blue}'::rainbow[]);
102 SELECT 'red' = ALL ('{red,green,blue}'::rainbow[]);
103 SELECT 'red' = ALL ('{red,red}'::rainbow[]);
106 -- Support functions
108 SELECT enum_first(NULL::rainbow);
109 SELECT enum_last('green'::rainbow);
110 SELECT enum_range(NULL::rainbow);
111 SELECT enum_range('orange'::rainbow, 'green'::rainbow);
112 SELECT enum_range(NULL, 'green'::rainbow);
113 SELECT enum_range('orange'::rainbow, NULL);
114 SELECT enum_range(NULL::rainbow, NULL);
117 -- User functions, can't test perl/python etc here since may not be compiled.
119 CREATE FUNCTION echo_me(anyenum) RETURNS text AS $$
120 BEGIN
121 RETURN $1::text || 'omg';
123 $$ LANGUAGE plpgsql;
124 SELECT echo_me('red'::rainbow);
126 -- Concrete function should override generic one
128 CREATE FUNCTION echo_me(rainbow) RETURNS text AS $$
129 BEGIN
130 RETURN $1::text || 'wtf';
132 $$ LANGUAGE plpgsql;
133 SELECT echo_me('red'::rainbow);
135 -- If we drop the original generic one, we don't have to qualify the type
136 -- anymore, since there's only one match
138 DROP FUNCTION echo_me(anyenum);
139 SELECT echo_me('red');
140 DROP FUNCTION echo_me(rainbow);
143 -- RI triggers on enum types
145 CREATE TABLE enumtest_parent (id rainbow PRIMARY KEY);
146 CREATE TABLE enumtest_child (parent rainbow REFERENCES enumtest_parent);
147 INSERT INTO enumtest_parent VALUES ('red');
148 INSERT INTO enumtest_child VALUES ('red');
149 INSERT INTO enumtest_child VALUES ('blue');  -- fail
150 DELETE FROM enumtest_parent;  -- fail
152 -- cross-type RI should fail
154 CREATE TYPE bogus AS ENUM('good', 'bad', 'ugly');
155 CREATE TABLE enumtest_bogus_child(parent bogus REFERENCES enumtest_parent);
156 DROP TYPE bogus;
159 -- Cleanup
161 DROP TABLE enumtest_child;
162 DROP TABLE enumtest_parent;
163 DROP TABLE enumtest;
164 DROP TYPE rainbow;
167 -- Verify properly cleaned up
169 SELECT COUNT(*) FROM pg_type WHERE typname = 'rainbow';
170 SELECT * FROM pg_enum WHERE NOT EXISTS
171   (SELECT 1 FROM pg_type WHERE pg_type.oid = enumtypid);