Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit b7fcf68

Browse files
committed
Require VALUE keyword when extending an enum type. Based on a patch from Alvaro Herrera.
1 parent 4acf99b commit b7fcf68

File tree

4 files changed

+86
-86
lines changed

4 files changed

+86
-86
lines changed

doc/src/sgml/ref/alter_type.sgml

+4-4
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ ALTER TYPE <replaceable class="PARAMETER">name</replaceable> OWNER TO <replaceab
2828
ALTER TYPE <replaceable class="PARAMETER">name</replaceable> RENAME ATTRIBUTE <replaceable class="PARAMETER">attribute_name</replaceable> TO <replaceable class="PARAMETER">new_attribute_name</replaceable>
2929
ALTER TYPE <replaceable class="PARAMETER">name</replaceable> RENAME TO <replaceable class="PARAMETER">new_name</replaceable>
3030
ALTER TYPE <replaceable class="PARAMETER">name</replaceable> SET SCHEMA <replaceable class="PARAMETER">new_schema</replaceable>
31-
ALTER TYPE <replaceable class="PARAMETER">name</replaceable> ADD <replaceable class="PARAMETER">new_enum_value</replaceable> [ { BEFORE | AFTER } <replaceable class="PARAMETER">existing_enum_value</replaceable> ]
31+
ALTER TYPE <replaceable class="PARAMETER">name</replaceable> ADD VALUE <replaceable class="PARAMETER">new_enum_value</replaceable> [ { BEFORE | AFTER } <replaceable class="PARAMETER">existing_enum_value</replaceable> ]
3232

3333
<phrase>where <replaceable class="PARAMETER">action</replaceable> is one of:</phrase>
3434

@@ -106,7 +106,7 @@ ALTER TYPE <replaceable class="PARAMETER">name</replaceable> ADD <replaceable cl
106106
</varlistentry>
107107

108108
<varlistentry>
109-
<term><literal>ADD [ BEFORE | AFTER ]</literal></term>
109+
<term><literal>ADD VALUE [ BEFORE | AFTER ]</literal></term>
110110
<listitem>
111111
<para>
112112
This form adds a new value to an enum type. If the new value's place in
@@ -238,7 +238,7 @@ ALTER TYPE <replaceable class="PARAMETER">name</replaceable> ADD <replaceable cl
238238
<title>Notes</title>
239239

240240
<para>
241-
<command>ALTER TYPE ... ADD</> (the form that adds a new value to an
241+
<command>ALTER TYPE ... ADD VALUE</> (the form that adds a new value to an
242242
enum type) cannot be executed inside a transaction block.
243243
</para>
244244

@@ -292,7 +292,7 @@ ALTER TYPE compfoo ADD ATTRIBUTE f3 int;
292292
<para>
293293
To add a new value to an enum type in a particular sort position:
294294
<programlisting>
295-
ALTER TYPE colors ADD 'orange' AFTER 'red';
295+
ALTER TYPE colors ADD VALUE 'orange' AFTER 'red';
296296
</programlisting>
297297
</para>
298298
</refsect1>

src/backend/parser/gram.y

+8-8
Original file line numberDiff line numberDiff line change
@@ -3871,30 +3871,30 @@ enum_val_list: Sconst
38713871
*****************************************************************************/
38723872

38733873
AlterEnumStmt:
3874-
ALTER TYPE_P any_name ADD_P Sconst
3874+
ALTER TYPE_P any_name ADD_P VALUE_P Sconst
38753875
{
38763876
AlterEnumStmt *n = makeNode(AlterEnumStmt);
38773877
n->typeName = $3;
3878-
n->newVal = $5;
3878+
n->newVal = $6;
38793879
n->newValNeighbor = NULL;
38803880
n->newValIsAfter = true;
38813881
$$ = (Node *) n;
38823882
}
3883-
| ALTER TYPE_P any_name ADD_P Sconst BEFORE Sconst
3883+
| ALTER TYPE_P any_name ADD_P VALUE_P Sconst BEFORE Sconst
38843884
{
38853885
AlterEnumStmt *n = makeNode(AlterEnumStmt);
38863886
n->typeName = $3;
3887-
n->newVal = $5;
3888-
n->newValNeighbor = $7;
3887+
n->newVal = $6;
3888+
n->newValNeighbor = $8;
38893889
n->newValIsAfter = false;
38903890
$$ = (Node *) n;
38913891
}
3892-
| ALTER TYPE_P any_name ADD_P Sconst AFTER Sconst
3892+
| ALTER TYPE_P any_name ADD_P VALUE_P Sconst AFTER Sconst
38933893
{
38943894
AlterEnumStmt *n = makeNode(AlterEnumStmt);
38953895
n->typeName = $3;
3896-
n->newVal = $5;
3897-
n->newValNeighbor = $7;
3896+
n->newVal = $6;
3897+
n->newValNeighbor = $8;
38983898
n->newValIsAfter = true;
38993899
$$ = (Node *) n;
39003900
}

src/test/regress/expected/enum.out

+37-37
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ ORDER BY 2;
3939
mars | 3
4040
(3 rows)
4141

42-
ALTER TYPE planets ADD 'uranus';
42+
ALTER TYPE planets ADD VALUE 'uranus';
4343
SELECT enumlabel, enumsortorder
4444
FROM pg_enum
4545
WHERE enumtypid = 'planets'::regtype
@@ -52,10 +52,10 @@ ORDER BY 2;
5252
uranus | 4
5353
(4 rows)
5454

55-
ALTER TYPE planets ADD 'mercury' BEFORE 'venus';
56-
ALTER TYPE planets ADD 'saturn' BEFORE 'uranus';
57-
ALTER TYPE planets ADD 'jupiter' AFTER 'mars';
58-
ALTER TYPE planets ADD 'neptune' AFTER 'uranus';
55+
ALTER TYPE planets ADD VALUE 'mercury' BEFORE 'venus';
56+
ALTER TYPE planets ADD VALUE 'saturn' BEFORE 'uranus';
57+
ALTER TYPE planets ADD VALUE 'jupiter' AFTER 'mars';
58+
ALTER TYPE planets ADD VALUE 'neptune' AFTER 'uranus';
5959
SELECT enumlabel, enumsortorder
6060
FROM pg_enum
6161
WHERE enumtypid = 'planets'::regtype
@@ -89,46 +89,46 @@ ORDER BY enumlabel::planets;
8989
(8 rows)
9090

9191
-- errors for adding labels
92-
ALTER TYPE planets ADD
92+
ALTER TYPE planets ADD VALUE
9393
'plutoplutoplutoplutoplutoplutoplutoplutoplutoplutoplutoplutoplutopluto';
9494
ERROR: invalid enum label "plutoplutoplutoplutoplutoplutoplutoplutoplutoplutoplutoplutoplutopluto"
9595
DETAIL: Labels must be 63 characters or less.
96-
ALTER TYPE planets ADD 'pluto' AFTER 'zeus';
96+
ALTER TYPE planets ADD VALUE 'pluto' AFTER 'zeus';
9797
ERROR: "zeus" is not an existing enum label
9898
--
9999
-- Test inserting so many values that we have to renumber
100100
--
101101
create type insenum as enum ('L1', 'L2');
102-
alter type insenum add 'i1' before 'L2';
103-
alter type insenum add 'i2' before 'L2';
104-
alter type insenum add 'i3' before 'L2';
105-
alter type insenum add 'i4' before 'L2';
106-
alter type insenum add 'i5' before 'L2';
107-
alter type insenum add 'i6' before 'L2';
108-
alter type insenum add 'i7' before 'L2';
109-
alter type insenum add 'i8' before 'L2';
110-
alter type insenum add 'i9' before 'L2';
111-
alter type insenum add 'i10' before 'L2';
112-
alter type insenum add 'i11' before 'L2';
113-
alter type insenum add 'i12' before 'L2';
114-
alter type insenum add 'i13' before 'L2';
115-
alter type insenum add 'i14' before 'L2';
116-
alter type insenum add 'i15' before 'L2';
117-
alter type insenum add 'i16' before 'L2';
118-
alter type insenum add 'i17' before 'L2';
119-
alter type insenum add 'i18' before 'L2';
120-
alter type insenum add 'i19' before 'L2';
121-
alter type insenum add 'i20' before 'L2';
122-
alter type insenum add 'i21' before 'L2';
123-
alter type insenum add 'i22' before 'L2';
124-
alter type insenum add 'i23' before 'L2';
125-
alter type insenum add 'i24' before 'L2';
126-
alter type insenum add 'i25' before 'L2';
127-
alter type insenum add 'i26' before 'L2';
128-
alter type insenum add 'i27' before 'L2';
129-
alter type insenum add 'i28' before 'L2';
130-
alter type insenum add 'i29' before 'L2';
131-
alter type insenum add 'i30' before 'L2';
102+
alter type insenum add value 'i1' before 'L2';
103+
alter type insenum add value 'i2' before 'L2';
104+
alter type insenum add value 'i3' before 'L2';
105+
alter type insenum add value 'i4' before 'L2';
106+
alter type insenum add value 'i5' before 'L2';
107+
alter type insenum add value 'i6' before 'L2';
108+
alter type insenum add value 'i7' before 'L2';
109+
alter type insenum add value 'i8' before 'L2';
110+
alter type insenum add value 'i9' before 'L2';
111+
alter type insenum add value 'i10' before 'L2';
112+
alter type insenum add value 'i11' before 'L2';
113+
alter type insenum add value 'i12' before 'L2';
114+
alter type insenum add value 'i13' before 'L2';
115+
alter type insenum add value 'i14' before 'L2';
116+
alter type insenum add value 'i15' before 'L2';
117+
alter type insenum add value 'i16' before 'L2';
118+
alter type insenum add value 'i17' before 'L2';
119+
alter type insenum add value 'i18' before 'L2';
120+
alter type insenum add value 'i19' before 'L2';
121+
alter type insenum add value 'i20' before 'L2';
122+
alter type insenum add value 'i21' before 'L2';
123+
alter type insenum add value 'i22' before 'L2';
124+
alter type insenum add value 'i23' before 'L2';
125+
alter type insenum add value 'i24' before 'L2';
126+
alter type insenum add value 'i25' before 'L2';
127+
alter type insenum add value 'i26' before 'L2';
128+
alter type insenum add value 'i27' before 'L2';
129+
alter type insenum add value 'i28' before 'L2';
130+
alter type insenum add value 'i29' before 'L2';
131+
alter type insenum add value 'i30' before 'L2';
132132
-- The exact values of enumsortorder will now depend on the local properties
133133
-- of float4, but in any reasonable implementation we should get at least
134134
-- 20 splits before having to renumber; so only hide values > 20.

src/test/regress/sql/enum.sql

+37-37
Original file line numberDiff line numberDiff line change
@@ -26,17 +26,17 @@ FROM pg_enum
2626
WHERE enumtypid = 'planets'::regtype
2727
ORDER BY 2;
2828

29-
ALTER TYPE planets ADD 'uranus';
29+
ALTER TYPE planets ADD VALUE 'uranus';
3030

3131
SELECT enumlabel, enumsortorder
3232
FROM pg_enum
3333
WHERE enumtypid = 'planets'::regtype
3434
ORDER BY 2;
3535

36-
ALTER TYPE planets ADD 'mercury' BEFORE 'venus';
37-
ALTER TYPE planets ADD 'saturn' BEFORE 'uranus';
38-
ALTER TYPE planets ADD 'jupiter' AFTER 'mars';
39-
ALTER TYPE planets ADD 'neptune' AFTER 'uranus';
36+
ALTER TYPE planets ADD VALUE 'mercury' BEFORE 'venus';
37+
ALTER TYPE planets ADD VALUE 'saturn' BEFORE 'uranus';
38+
ALTER TYPE planets ADD VALUE 'jupiter' AFTER 'mars';
39+
ALTER TYPE planets ADD VALUE 'neptune' AFTER 'uranus';
4040

4141
SELECT enumlabel, enumsortorder
4242
FROM pg_enum
@@ -49,47 +49,47 @@ WHERE enumtypid = 'planets'::regtype
4949
ORDER BY enumlabel::planets;
5050

5151
-- errors for adding labels
52-
ALTER TYPE planets ADD
52+
ALTER TYPE planets ADD VALUE
5353
'plutoplutoplutoplutoplutoplutoplutoplutoplutoplutoplutoplutoplutopluto';
5454

55-
ALTER TYPE planets ADD 'pluto' AFTER 'zeus';
55+
ALTER TYPE planets ADD VALUE 'pluto' AFTER 'zeus';
5656

5757
--
5858
-- Test inserting so many values that we have to renumber
5959
--
6060

6161
create type insenum as enum ('L1', 'L2');
6262

63-
alter type insenum add 'i1' before 'L2';
64-
alter type insenum add 'i2' before 'L2';
65-
alter type insenum add 'i3' before 'L2';
66-
alter type insenum add 'i4' before 'L2';
67-
alter type insenum add 'i5' before 'L2';
68-
alter type insenum add 'i6' before 'L2';
69-
alter type insenum add 'i7' before 'L2';
70-
alter type insenum add 'i8' before 'L2';
71-
alter type insenum add 'i9' before 'L2';
72-
alter type insenum add 'i10' before 'L2';
73-
alter type insenum add 'i11' before 'L2';
74-
alter type insenum add 'i12' before 'L2';
75-
alter type insenum add 'i13' before 'L2';
76-
alter type insenum add 'i14' before 'L2';
77-
alter type insenum add 'i15' before 'L2';
78-
alter type insenum add 'i16' before 'L2';
79-
alter type insenum add 'i17' before 'L2';
80-
alter type insenum add 'i18' before 'L2';
81-
alter type insenum add 'i19' before 'L2';
82-
alter type insenum add 'i20' before 'L2';
83-
alter type insenum add 'i21' before 'L2';
84-
alter type insenum add 'i22' before 'L2';
85-
alter type insenum add 'i23' before 'L2';
86-
alter type insenum add 'i24' before 'L2';
87-
alter type insenum add 'i25' before 'L2';
88-
alter type insenum add 'i26' before 'L2';
89-
alter type insenum add 'i27' before 'L2';
90-
alter type insenum add 'i28' before 'L2';
91-
alter type insenum add 'i29' before 'L2';
92-
alter type insenum add 'i30' before 'L2';
63+
alter type insenum add value 'i1' before 'L2';
64+
alter type insenum add value 'i2' before 'L2';
65+
alter type insenum add value 'i3' before 'L2';
66+
alter type insenum add value 'i4' before 'L2';
67+
alter type insenum add value 'i5' before 'L2';
68+
alter type insenum add value 'i6' before 'L2';
69+
alter type insenum add value 'i7' before 'L2';
70+
alter type insenum add value 'i8' before 'L2';
71+
alter type insenum add value 'i9' before 'L2';
72+
alter type insenum add value 'i10' before 'L2';
73+
alter type insenum add value 'i11' before 'L2';
74+
alter type insenum add value 'i12' before 'L2';
75+
alter type insenum add value 'i13' before 'L2';
76+
alter type insenum add value 'i14' before 'L2';
77+
alter type insenum add value 'i15' before 'L2';
78+
alter type insenum add value 'i16' before 'L2';
79+
alter type insenum add value 'i17' before 'L2';
80+
alter type insenum add value 'i18' before 'L2';
81+
alter type insenum add value 'i19' before 'L2';
82+
alter type insenum add value 'i20' before 'L2';
83+
alter type insenum add value 'i21' before 'L2';
84+
alter type insenum add value 'i22' before 'L2';
85+
alter type insenum add value 'i23' before 'L2';
86+
alter type insenum add value 'i24' before 'L2';
87+
alter type insenum add value 'i25' before 'L2';
88+
alter type insenum add value 'i26' before 'L2';
89+
alter type insenum add value 'i27' before 'L2';
90+
alter type insenum add value 'i28' before 'L2';
91+
alter type insenum add value 'i29' before 'L2';
92+
alter type insenum add value 'i30' before 'L2';
9393

9494
-- The exact values of enumsortorder will now depend on the local properties
9595
-- of float4, but in any reasonable implementation we should get at least

0 commit comments

Comments
 (0)