mirror of
https://github.com/postgres/postgres.git
synced 2025-09-09 13:09:39 +03:00
Allow new values to be added to an existing enum type.
After much expenditure of effort, we've got this to the point where the performance penalty is pretty minimal in typical cases. Andrew Dunstan, reviewed by Brendan Jurd, Dean Rasheed, and Tom Lane
This commit is contained in:
@@ -15,6 +15,92 @@ SELECT COUNT(*) FROM pg_enum WHERE enumtypid = 'rainbow'::regtype;
|
||||
SELECT 'red'::rainbow;
|
||||
SELECT 'mauve'::rainbow;
|
||||
|
||||
--
|
||||
-- adding new values
|
||||
--
|
||||
|
||||
CREATE TYPE planets AS ENUM ( 'venus', 'earth', 'mars' );
|
||||
|
||||
SELECT enumlabel, enumsortorder
|
||||
FROM pg_enum
|
||||
WHERE enumtypid = 'planets'::regtype
|
||||
ORDER BY 2;
|
||||
|
||||
ALTER TYPE planets ADD 'uranus';
|
||||
|
||||
SELECT enumlabel, enumsortorder
|
||||
FROM pg_enum
|
||||
WHERE enumtypid = 'planets'::regtype
|
||||
ORDER BY 2;
|
||||
|
||||
ALTER TYPE planets ADD 'mercury' BEFORE 'venus';
|
||||
ALTER TYPE planets ADD 'saturn' BEFORE 'uranus';
|
||||
ALTER TYPE planets ADD 'jupiter' AFTER 'mars';
|
||||
ALTER TYPE planets ADD 'neptune' AFTER 'uranus';
|
||||
|
||||
SELECT enumlabel, enumsortorder
|
||||
FROM pg_enum
|
||||
WHERE enumtypid = 'planets'::regtype
|
||||
ORDER BY 2;
|
||||
|
||||
SELECT enumlabel, enumsortorder
|
||||
FROM pg_enum
|
||||
WHERE enumtypid = 'planets'::regtype
|
||||
ORDER BY enumlabel::planets;
|
||||
|
||||
-- errors for adding labels
|
||||
ALTER TYPE planets ADD
|
||||
'plutoplutoplutoplutoplutoplutoplutoplutoplutoplutoplutoplutoplutopluto';
|
||||
|
||||
ALTER TYPE planets ADD 'pluto' AFTER 'zeus';
|
||||
|
||||
--
|
||||
-- Test inserting so many values that we have to renumber
|
||||
--
|
||||
|
||||
create type insenum as enum ('L1', 'L2');
|
||||
|
||||
alter type insenum add 'i1' before 'L2';
|
||||
alter type insenum add 'i2' before 'L2';
|
||||
alter type insenum add 'i3' before 'L2';
|
||||
alter type insenum add 'i4' before 'L2';
|
||||
alter type insenum add 'i5' before 'L2';
|
||||
alter type insenum add 'i6' before 'L2';
|
||||
alter type insenum add 'i7' before 'L2';
|
||||
alter type insenum add 'i8' before 'L2';
|
||||
alter type insenum add 'i9' before 'L2';
|
||||
alter type insenum add 'i10' before 'L2';
|
||||
alter type insenum add 'i11' before 'L2';
|
||||
alter type insenum add 'i12' before 'L2';
|
||||
alter type insenum add 'i13' before 'L2';
|
||||
alter type insenum add 'i14' before 'L2';
|
||||
alter type insenum add 'i15' before 'L2';
|
||||
alter type insenum add 'i16' before 'L2';
|
||||
alter type insenum add 'i17' before 'L2';
|
||||
alter type insenum add 'i18' before 'L2';
|
||||
alter type insenum add 'i19' before 'L2';
|
||||
alter type insenum add 'i20' before 'L2';
|
||||
alter type insenum add 'i21' before 'L2';
|
||||
alter type insenum add 'i22' before 'L2';
|
||||
alter type insenum add 'i23' before 'L2';
|
||||
alter type insenum add 'i24' before 'L2';
|
||||
alter type insenum add 'i25' before 'L2';
|
||||
alter type insenum add 'i26' before 'L2';
|
||||
alter type insenum add 'i27' before 'L2';
|
||||
alter type insenum add 'i28' before 'L2';
|
||||
alter type insenum add 'i29' before 'L2';
|
||||
alter type insenum add 'i30' before 'L2';
|
||||
|
||||
-- The exact values of enumsortorder will now depend on the local properties
|
||||
-- of float4, but in any reasonable implementation we should get at least
|
||||
-- 20 splits before having to renumber; so only hide values > 20.
|
||||
|
||||
SELECT enumlabel,
|
||||
case when enumsortorder > 20 then null else enumsortorder end as so
|
||||
FROM pg_enum
|
||||
WHERE enumtypid = 'insenum'::regtype
|
||||
ORDER BY enumsortorder;
|
||||
|
||||
--
|
||||
-- Basic table creation, row selection
|
||||
--
|
||||
|
Reference in New Issue
Block a user