mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-10-12 06:16:53 +02:00
172 lines
4.2 KiB
MySQL
172 lines
4.2 KiB
MySQL
|
--
|
||
|
-- Enum tests
|
||
|
--
|
||
|
|
||
|
CREATE TYPE rainbow AS ENUM ('red', 'orange', 'yellow', 'green', 'blue', 'purple');
|
||
|
|
||
|
--
|
||
|
-- Did it create the right number of rows?
|
||
|
--
|
||
|
SELECT COUNT(*) FROM pg_enum WHERE enumtypid = 'rainbow'::regtype;
|
||
|
|
||
|
--
|
||
|
-- I/O functions
|
||
|
--
|
||
|
SELECT 'red'::rainbow;
|
||
|
SELECT 'mauve'::rainbow;
|
||
|
|
||
|
--
|
||
|
-- Basic table creation, row selection
|
||
|
--
|
||
|
CREATE TABLE enumtest (col rainbow);
|
||
|
INSERT INTO enumtest values ('red'), ('orange'), ('yellow'), ('green');
|
||
|
COPY enumtest FROM stdin;
|
||
|
blue
|
||
|
purple
|
||
|
\.
|
||
|
SELECT * FROM enumtest;
|
||
|
|
||
|
--
|
||
|
-- Operators, no index
|
||
|
--
|
||
|
SELECT * FROM enumtest WHERE col = 'orange';
|
||
|
SELECT * FROM enumtest WHERE col <> 'orange' ORDER BY col;
|
||
|
SELECT * FROM enumtest WHERE col > 'yellow' ORDER BY col;
|
||
|
SELECT * FROM enumtest WHERE col >= 'yellow' ORDER BY col;
|
||
|
SELECT * FROM enumtest WHERE col < 'green' ORDER BY col;
|
||
|
SELECT * FROM enumtest WHERE col <= 'green' ORDER BY col;
|
||
|
|
||
|
--
|
||
|
-- Cast to/from text
|
||
|
--
|
||
|
SELECT 'red'::rainbow::text || 'hithere';
|
||
|
SELECT 'red'::text::rainbow = 'red'::rainbow;
|
||
|
|
||
|
--
|
||
|
-- Aggregates
|
||
|
--
|
||
|
SELECT min(col) FROM enumtest;
|
||
|
SELECT max(col) FROM enumtest;
|
||
|
SELECT max(col) FROM enumtest WHERE col < 'green';
|
||
|
|
||
|
--
|
||
|
-- Index tests, force use of index
|
||
|
--
|
||
|
SET enable_seqscan = off;
|
||
|
SET enable_bitmapscan = off;
|
||
|
|
||
|
--
|
||
|
-- Btree index / opclass with the various operators
|
||
|
--
|
||
|
CREATE UNIQUE INDEX enumtest_btree ON enumtest USING btree (col);
|
||
|
SELECT * FROM enumtest WHERE col = 'orange';
|
||
|
SELECT * FROM enumtest WHERE col <> 'orange' ORDER BY col;
|
||
|
SELECT * FROM enumtest WHERE col > 'yellow' ORDER BY col;
|
||
|
SELECT * FROM enumtest WHERE col >= 'yellow' ORDER BY col;
|
||
|
SELECT * FROM enumtest WHERE col < 'green' ORDER BY col;
|
||
|
SELECT * FROM enumtest WHERE col <= 'green' ORDER BY col;
|
||
|
SELECT min(col) FROM enumtest;
|
||
|
SELECT max(col) FROM enumtest;
|
||
|
SELECT max(col) FROM enumtest WHERE col < 'green';
|
||
|
DROP INDEX enumtest_btree;
|
||
|
|
||
|
--
|
||
|
-- Hash index / opclass with the = operator
|
||
|
--
|
||
|
CREATE INDEX enumtest_hash ON enumtest USING hash (col);
|
||
|
SELECT * FROM enumtest WHERE col = 'orange';
|
||
|
DROP INDEX enumtest_hash;
|
||
|
|
||
|
--
|
||
|
-- End index tests
|
||
|
--
|
||
|
RESET enable_seqscan;
|
||
|
RESET enable_bitmapscan;
|
||
|
|
||
|
--
|
||
|
-- Domains over enums
|
||
|
--
|
||
|
CREATE DOMAIN rgb AS rainbow CHECK (VALUE IN ('red', 'green', 'blue'));
|
||
|
SELECT 'red'::rgb;
|
||
|
SELECT 'purple'::rgb;
|
||
|
SELECT 'purple'::rainbow::rgb;
|
||
|
DROP DOMAIN rgb;
|
||
|
|
||
|
--
|
||
|
-- Arrays
|
||
|
--
|
||
|
SELECT '{red,green,blue}'::rainbow[];
|
||
|
SELECT ('{red,green,blue}'::rainbow[])[2];
|
||
|
SELECT 'red' = ANY ('{red,green,blue}'::rainbow[]);
|
||
|
SELECT 'yellow' = ANY ('{red,green,blue}'::rainbow[]);
|
||
|
SELECT 'red' = ALL ('{red,green,blue}'::rainbow[]);
|
||
|
SELECT 'red' = ALL ('{red,red}'::rainbow[]);
|
||
|
|
||
|
--
|
||
|
-- Support functions
|
||
|
--
|
||
|
SELECT enum_first(NULL::rainbow);
|
||
|
SELECT enum_last('green'::rainbow);
|
||
|
SELECT enum_range(NULL::rainbow);
|
||
|
SELECT enum_range('orange'::rainbow, 'green'::rainbow);
|
||
|
SELECT enum_range(NULL, 'green'::rainbow);
|
||
|
SELECT enum_range('orange'::rainbow, NULL);
|
||
|
SELECT enum_range(NULL::rainbow, NULL);
|
||
|
|
||
|
--
|
||
|
-- User functions, can't test perl/python etc here since may not be compiled.
|
||
|
--
|
||
|
CREATE FUNCTION echo_me(anyenum) RETURNS text AS $$
|
||
|
BEGIN
|
||
|
RETURN $1::text || 'omg';
|
||
|
END
|
||
|
$$ LANGUAGE plpgsql;
|
||
|
SELECT echo_me('red'::rainbow);
|
||
|
--
|
||
|
-- Concrete function should override generic one
|
||
|
--
|
||
|
CREATE FUNCTION echo_me(rainbow) RETURNS text AS $$
|
||
|
BEGIN
|
||
|
RETURN $1::text || 'wtf';
|
||
|
END
|
||
|
$$ LANGUAGE plpgsql;
|
||
|
SELECT echo_me('red'::rainbow);
|
||
|
--
|
||
|
-- If we drop the original generic one, we don't have to qualify the type
|
||
|
-- anymore, since there's only one match
|
||
|
--
|
||
|
DROP FUNCTION echo_me(anyenum);
|
||
|
SELECT echo_me('red');
|
||
|
DROP FUNCTION echo_me(rainbow);
|
||
|
|
||
|
--
|
||
|
-- RI triggers on enum types
|
||
|
--
|
||
|
CREATE TABLE enumtest_parent (id rainbow PRIMARY KEY);
|
||
|
CREATE TABLE enumtest_child (parent rainbow REFERENCES enumtest_parent);
|
||
|
INSERT INTO enumtest_parent VALUES ('red');
|
||
|
INSERT INTO enumtest_child VALUES ('red');
|
||
|
INSERT INTO enumtest_child VALUES ('blue'); -- fail
|
||
|
DELETE FROM enumtest_parent; -- fail
|
||
|
--
|
||
|
-- cross-type RI should fail
|
||
|
--
|
||
|
CREATE TYPE bogus AS ENUM('good', 'bad', 'ugly');
|
||
|
CREATE TABLE enumtest_bogus_child(parent bogus REFERENCES enumtest_parent);
|
||
|
DROP TYPE bogus;
|
||
|
|
||
|
--
|
||
|
-- Cleanup
|
||
|
--
|
||
|
DROP TABLE enumtest_child;
|
||
|
DROP TABLE enumtest_parent;
|
||
|
DROP TABLE enumtest;
|
||
|
DROP TYPE rainbow;
|
||
|
|
||
|
--
|
||
|
-- Verify properly cleaned up
|
||
|
--
|
||
|
SELECT COUNT(*) FROM pg_type WHERE typname = 'rainbow';
|
||
|
SELECT * FROM pg_enum WHERE NOT EXISTS
|
||
|
(SELECT 1 FROM pg_type WHERE pg_type.oid = enumtypid);
|