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

Lines changed: 4 additions & 4 deletions
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

Lines changed: 8 additions & 8 deletions
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

Lines changed: 37 additions & 37 deletions
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

Lines changed: 37 additions & 37 deletions
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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy