Require VALUE keyword when extending an enum type. Based on a patch from Alvaro Herrera.
This commit is contained in:
parent
4acf99b2f3
commit
b7fcf68e86
@ -28,7 +28,7 @@ ALTER TYPE <replaceable class="PARAMETER">name</replaceable> OWNER TO <replaceab
|
|||||||
ALTER TYPE <replaceable class="PARAMETER">name</replaceable> RENAME ATTRIBUTE <replaceable class="PARAMETER">attribute_name</replaceable> TO <replaceable class="PARAMETER">new_attribute_name</replaceable>
|
ALTER TYPE <replaceable class="PARAMETER">name</replaceable> RENAME ATTRIBUTE <replaceable class="PARAMETER">attribute_name</replaceable> TO <replaceable class="PARAMETER">new_attribute_name</replaceable>
|
||||||
ALTER TYPE <replaceable class="PARAMETER">name</replaceable> RENAME TO <replaceable class="PARAMETER">new_name</replaceable>
|
ALTER TYPE <replaceable class="PARAMETER">name</replaceable> RENAME TO <replaceable class="PARAMETER">new_name</replaceable>
|
||||||
ALTER TYPE <replaceable class="PARAMETER">name</replaceable> SET SCHEMA <replaceable class="PARAMETER">new_schema</replaceable>
|
ALTER TYPE <replaceable class="PARAMETER">name</replaceable> SET SCHEMA <replaceable class="PARAMETER">new_schema</replaceable>
|
||||||
ALTER TYPE <replaceable class="PARAMETER">name</replaceable> ADD <replaceable class="PARAMETER">new_enum_value</replaceable> [ { BEFORE | AFTER } <replaceable class="PARAMETER">existing_enum_value</replaceable> ]
|
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> ]
|
||||||
|
|
||||||
<phrase>where <replaceable class="PARAMETER">action</replaceable> is one of:</phrase>
|
<phrase>where <replaceable class="PARAMETER">action</replaceable> is one of:</phrase>
|
||||||
|
|
||||||
@ -106,7 +106,7 @@ ALTER TYPE <replaceable class="PARAMETER">name</replaceable> ADD <replaceable cl
|
|||||||
</varlistentry>
|
</varlistentry>
|
||||||
|
|
||||||
<varlistentry>
|
<varlistentry>
|
||||||
<term><literal>ADD [ BEFORE | AFTER ]</literal></term>
|
<term><literal>ADD VALUE [ BEFORE | AFTER ]</literal></term>
|
||||||
<listitem>
|
<listitem>
|
||||||
<para>
|
<para>
|
||||||
This form adds a new value to an enum type. If the new value's place in
|
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
|
|||||||
<title>Notes</title>
|
<title>Notes</title>
|
||||||
|
|
||||||
<para>
|
<para>
|
||||||
<command>ALTER TYPE ... ADD</> (the form that adds a new value to an
|
<command>ALTER TYPE ... ADD VALUE</> (the form that adds a new value to an
|
||||||
enum type) cannot be executed inside a transaction block.
|
enum type) cannot be executed inside a transaction block.
|
||||||
</para>
|
</para>
|
||||||
|
|
||||||
@ -292,7 +292,7 @@ ALTER TYPE compfoo ADD ATTRIBUTE f3 int;
|
|||||||
<para>
|
<para>
|
||||||
To add a new value to an enum type in a particular sort position:
|
To add a new value to an enum type in a particular sort position:
|
||||||
<programlisting>
|
<programlisting>
|
||||||
ALTER TYPE colors ADD 'orange' AFTER 'red';
|
ALTER TYPE colors ADD VALUE 'orange' AFTER 'red';
|
||||||
</programlisting>
|
</programlisting>
|
||||||
</para>
|
</para>
|
||||||
</refsect1>
|
</refsect1>
|
||||||
|
@ -3871,30 +3871,30 @@ enum_val_list: Sconst
|
|||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
|
|
||||||
AlterEnumStmt:
|
AlterEnumStmt:
|
||||||
ALTER TYPE_P any_name ADD_P Sconst
|
ALTER TYPE_P any_name ADD_P VALUE_P Sconst
|
||||||
{
|
{
|
||||||
AlterEnumStmt *n = makeNode(AlterEnumStmt);
|
AlterEnumStmt *n = makeNode(AlterEnumStmt);
|
||||||
n->typeName = $3;
|
n->typeName = $3;
|
||||||
n->newVal = $5;
|
n->newVal = $6;
|
||||||
n->newValNeighbor = NULL;
|
n->newValNeighbor = NULL;
|
||||||
n->newValIsAfter = true;
|
n->newValIsAfter = true;
|
||||||
$$ = (Node *) n;
|
$$ = (Node *) n;
|
||||||
}
|
}
|
||||||
| ALTER TYPE_P any_name ADD_P Sconst BEFORE Sconst
|
| ALTER TYPE_P any_name ADD_P VALUE_P Sconst BEFORE Sconst
|
||||||
{
|
{
|
||||||
AlterEnumStmt *n = makeNode(AlterEnumStmt);
|
AlterEnumStmt *n = makeNode(AlterEnumStmt);
|
||||||
n->typeName = $3;
|
n->typeName = $3;
|
||||||
n->newVal = $5;
|
n->newVal = $6;
|
||||||
n->newValNeighbor = $7;
|
n->newValNeighbor = $8;
|
||||||
n->newValIsAfter = false;
|
n->newValIsAfter = false;
|
||||||
$$ = (Node *) n;
|
$$ = (Node *) n;
|
||||||
}
|
}
|
||||||
| ALTER TYPE_P any_name ADD_P Sconst AFTER Sconst
|
| ALTER TYPE_P any_name ADD_P VALUE_P Sconst AFTER Sconst
|
||||||
{
|
{
|
||||||
AlterEnumStmt *n = makeNode(AlterEnumStmt);
|
AlterEnumStmt *n = makeNode(AlterEnumStmt);
|
||||||
n->typeName = $3;
|
n->typeName = $3;
|
||||||
n->newVal = $5;
|
n->newVal = $6;
|
||||||
n->newValNeighbor = $7;
|
n->newValNeighbor = $8;
|
||||||
n->newValIsAfter = true;
|
n->newValIsAfter = true;
|
||||||
$$ = (Node *) n;
|
$$ = (Node *) n;
|
||||||
}
|
}
|
||||||
|
@ -39,7 +39,7 @@ ORDER BY 2;
|
|||||||
mars | 3
|
mars | 3
|
||||||
(3 rows)
|
(3 rows)
|
||||||
|
|
||||||
ALTER TYPE planets ADD 'uranus';
|
ALTER TYPE planets ADD VALUE 'uranus';
|
||||||
SELECT enumlabel, enumsortorder
|
SELECT enumlabel, enumsortorder
|
||||||
FROM pg_enum
|
FROM pg_enum
|
||||||
WHERE enumtypid = 'planets'::regtype
|
WHERE enumtypid = 'planets'::regtype
|
||||||
@ -52,10 +52,10 @@ ORDER BY 2;
|
|||||||
uranus | 4
|
uranus | 4
|
||||||
(4 rows)
|
(4 rows)
|
||||||
|
|
||||||
ALTER TYPE planets ADD 'mercury' BEFORE 'venus';
|
ALTER TYPE planets ADD VALUE 'mercury' BEFORE 'venus';
|
||||||
ALTER TYPE planets ADD 'saturn' BEFORE 'uranus';
|
ALTER TYPE planets ADD VALUE 'saturn' BEFORE 'uranus';
|
||||||
ALTER TYPE planets ADD 'jupiter' AFTER 'mars';
|
ALTER TYPE planets ADD VALUE 'jupiter' AFTER 'mars';
|
||||||
ALTER TYPE planets ADD 'neptune' AFTER 'uranus';
|
ALTER TYPE planets ADD VALUE 'neptune' AFTER 'uranus';
|
||||||
SELECT enumlabel, enumsortorder
|
SELECT enumlabel, enumsortorder
|
||||||
FROM pg_enum
|
FROM pg_enum
|
||||||
WHERE enumtypid = 'planets'::regtype
|
WHERE enumtypid = 'planets'::regtype
|
||||||
@ -89,46 +89,46 @@ ORDER BY enumlabel::planets;
|
|||||||
(8 rows)
|
(8 rows)
|
||||||
|
|
||||||
-- errors for adding labels
|
-- errors for adding labels
|
||||||
ALTER TYPE planets ADD
|
ALTER TYPE planets ADD VALUE
|
||||||
'plutoplutoplutoplutoplutoplutoplutoplutoplutoplutoplutoplutoplutopluto';
|
'plutoplutoplutoplutoplutoplutoplutoplutoplutoplutoplutoplutoplutopluto';
|
||||||
ERROR: invalid enum label "plutoplutoplutoplutoplutoplutoplutoplutoplutoplutoplutoplutoplutopluto"
|
ERROR: invalid enum label "plutoplutoplutoplutoplutoplutoplutoplutoplutoplutoplutoplutoplutopluto"
|
||||||
DETAIL: Labels must be 63 characters or less.
|
DETAIL: Labels must be 63 characters or less.
|
||||||
ALTER TYPE planets ADD 'pluto' AFTER 'zeus';
|
ALTER TYPE planets ADD VALUE 'pluto' AFTER 'zeus';
|
||||||
ERROR: "zeus" is not an existing enum label
|
ERROR: "zeus" is not an existing enum label
|
||||||
--
|
--
|
||||||
-- Test inserting so many values that we have to renumber
|
-- Test inserting so many values that we have to renumber
|
||||||
--
|
--
|
||||||
create type insenum as enum ('L1', 'L2');
|
create type insenum as enum ('L1', 'L2');
|
||||||
alter type insenum add 'i1' before 'L2';
|
alter type insenum add value 'i1' before 'L2';
|
||||||
alter type insenum add 'i2' before 'L2';
|
alter type insenum add value 'i2' before 'L2';
|
||||||
alter type insenum add 'i3' before 'L2';
|
alter type insenum add value 'i3' before 'L2';
|
||||||
alter type insenum add 'i4' before 'L2';
|
alter type insenum add value 'i4' before 'L2';
|
||||||
alter type insenum add 'i5' before 'L2';
|
alter type insenum add value 'i5' before 'L2';
|
||||||
alter type insenum add 'i6' before 'L2';
|
alter type insenum add value 'i6' before 'L2';
|
||||||
alter type insenum add 'i7' before 'L2';
|
alter type insenum add value 'i7' before 'L2';
|
||||||
alter type insenum add 'i8' before 'L2';
|
alter type insenum add value 'i8' before 'L2';
|
||||||
alter type insenum add 'i9' before 'L2';
|
alter type insenum add value 'i9' before 'L2';
|
||||||
alter type insenum add 'i10' before 'L2';
|
alter type insenum add value 'i10' before 'L2';
|
||||||
alter type insenum add 'i11' before 'L2';
|
alter type insenum add value 'i11' before 'L2';
|
||||||
alter type insenum add 'i12' before 'L2';
|
alter type insenum add value 'i12' before 'L2';
|
||||||
alter type insenum add 'i13' before 'L2';
|
alter type insenum add value 'i13' before 'L2';
|
||||||
alter type insenum add 'i14' before 'L2';
|
alter type insenum add value 'i14' before 'L2';
|
||||||
alter type insenum add 'i15' before 'L2';
|
alter type insenum add value 'i15' before 'L2';
|
||||||
alter type insenum add 'i16' before 'L2';
|
alter type insenum add value 'i16' before 'L2';
|
||||||
alter type insenum add 'i17' before 'L2';
|
alter type insenum add value 'i17' before 'L2';
|
||||||
alter type insenum add 'i18' before 'L2';
|
alter type insenum add value 'i18' before 'L2';
|
||||||
alter type insenum add 'i19' before 'L2';
|
alter type insenum add value 'i19' before 'L2';
|
||||||
alter type insenum add 'i20' before 'L2';
|
alter type insenum add value 'i20' before 'L2';
|
||||||
alter type insenum add 'i21' before 'L2';
|
alter type insenum add value 'i21' before 'L2';
|
||||||
alter type insenum add 'i22' before 'L2';
|
alter type insenum add value 'i22' before 'L2';
|
||||||
alter type insenum add 'i23' before 'L2';
|
alter type insenum add value 'i23' before 'L2';
|
||||||
alter type insenum add 'i24' before 'L2';
|
alter type insenum add value 'i24' before 'L2';
|
||||||
alter type insenum add 'i25' before 'L2';
|
alter type insenum add value 'i25' before 'L2';
|
||||||
alter type insenum add 'i26' before 'L2';
|
alter type insenum add value 'i26' before 'L2';
|
||||||
alter type insenum add 'i27' before 'L2';
|
alter type insenum add value 'i27' before 'L2';
|
||||||
alter type insenum add 'i28' before 'L2';
|
alter type insenum add value 'i28' before 'L2';
|
||||||
alter type insenum add 'i29' before 'L2';
|
alter type insenum add value 'i29' before 'L2';
|
||||||
alter type insenum add 'i30' before 'L2';
|
alter type insenum add value 'i30' before 'L2';
|
||||||
-- The exact values of enumsortorder will now depend on the local properties
|
-- The exact values of enumsortorder will now depend on the local properties
|
||||||
-- of float4, but in any reasonable implementation we should get at least
|
-- of float4, but in any reasonable implementation we should get at least
|
||||||
-- 20 splits before having to renumber; so only hide values > 20.
|
-- 20 splits before having to renumber; so only hide values > 20.
|
||||||
|
@ -26,17 +26,17 @@ FROM pg_enum
|
|||||||
WHERE enumtypid = 'planets'::regtype
|
WHERE enumtypid = 'planets'::regtype
|
||||||
ORDER BY 2;
|
ORDER BY 2;
|
||||||
|
|
||||||
ALTER TYPE planets ADD 'uranus';
|
ALTER TYPE planets ADD VALUE 'uranus';
|
||||||
|
|
||||||
SELECT enumlabel, enumsortorder
|
SELECT enumlabel, enumsortorder
|
||||||
FROM pg_enum
|
FROM pg_enum
|
||||||
WHERE enumtypid = 'planets'::regtype
|
WHERE enumtypid = 'planets'::regtype
|
||||||
ORDER BY 2;
|
ORDER BY 2;
|
||||||
|
|
||||||
ALTER TYPE planets ADD 'mercury' BEFORE 'venus';
|
ALTER TYPE planets ADD VALUE 'mercury' BEFORE 'venus';
|
||||||
ALTER TYPE planets ADD 'saturn' BEFORE 'uranus';
|
ALTER TYPE planets ADD VALUE 'saturn' BEFORE 'uranus';
|
||||||
ALTER TYPE planets ADD 'jupiter' AFTER 'mars';
|
ALTER TYPE planets ADD VALUE 'jupiter' AFTER 'mars';
|
||||||
ALTER TYPE planets ADD 'neptune' AFTER 'uranus';
|
ALTER TYPE planets ADD VALUE 'neptune' AFTER 'uranus';
|
||||||
|
|
||||||
SELECT enumlabel, enumsortorder
|
SELECT enumlabel, enumsortorder
|
||||||
FROM pg_enum
|
FROM pg_enum
|
||||||
@ -49,10 +49,10 @@ WHERE enumtypid = 'planets'::regtype
|
|||||||
ORDER BY enumlabel::planets;
|
ORDER BY enumlabel::planets;
|
||||||
|
|
||||||
-- errors for adding labels
|
-- errors for adding labels
|
||||||
ALTER TYPE planets ADD
|
ALTER TYPE planets ADD VALUE
|
||||||
'plutoplutoplutoplutoplutoplutoplutoplutoplutoplutoplutoplutoplutopluto';
|
'plutoplutoplutoplutoplutoplutoplutoplutoplutoplutoplutoplutoplutopluto';
|
||||||
|
|
||||||
ALTER TYPE planets ADD 'pluto' AFTER 'zeus';
|
ALTER TYPE planets ADD VALUE 'pluto' AFTER 'zeus';
|
||||||
|
|
||||||
--
|
--
|
||||||
-- Test inserting so many values that we have to renumber
|
-- Test inserting so many values that we have to renumber
|
||||||
@ -60,36 +60,36 @@ ALTER TYPE planets ADD 'pluto' AFTER 'zeus';
|
|||||||
|
|
||||||
create type insenum as enum ('L1', 'L2');
|
create type insenum as enum ('L1', 'L2');
|
||||||
|
|
||||||
alter type insenum add 'i1' before 'L2';
|
alter type insenum add value 'i1' before 'L2';
|
||||||
alter type insenum add 'i2' before 'L2';
|
alter type insenum add value 'i2' before 'L2';
|
||||||
alter type insenum add 'i3' before 'L2';
|
alter type insenum add value 'i3' before 'L2';
|
||||||
alter type insenum add 'i4' before 'L2';
|
alter type insenum add value 'i4' before 'L2';
|
||||||
alter type insenum add 'i5' before 'L2';
|
alter type insenum add value 'i5' before 'L2';
|
||||||
alter type insenum add 'i6' before 'L2';
|
alter type insenum add value 'i6' before 'L2';
|
||||||
alter type insenum add 'i7' before 'L2';
|
alter type insenum add value 'i7' before 'L2';
|
||||||
alter type insenum add 'i8' before 'L2';
|
alter type insenum add value 'i8' before 'L2';
|
||||||
alter type insenum add 'i9' before 'L2';
|
alter type insenum add value 'i9' before 'L2';
|
||||||
alter type insenum add 'i10' before 'L2';
|
alter type insenum add value 'i10' before 'L2';
|
||||||
alter type insenum add 'i11' before 'L2';
|
alter type insenum add value 'i11' before 'L2';
|
||||||
alter type insenum add 'i12' before 'L2';
|
alter type insenum add value 'i12' before 'L2';
|
||||||
alter type insenum add 'i13' before 'L2';
|
alter type insenum add value 'i13' before 'L2';
|
||||||
alter type insenum add 'i14' before 'L2';
|
alter type insenum add value 'i14' before 'L2';
|
||||||
alter type insenum add 'i15' before 'L2';
|
alter type insenum add value 'i15' before 'L2';
|
||||||
alter type insenum add 'i16' before 'L2';
|
alter type insenum add value 'i16' before 'L2';
|
||||||
alter type insenum add 'i17' before 'L2';
|
alter type insenum add value 'i17' before 'L2';
|
||||||
alter type insenum add 'i18' before 'L2';
|
alter type insenum add value 'i18' before 'L2';
|
||||||
alter type insenum add 'i19' before 'L2';
|
alter type insenum add value 'i19' before 'L2';
|
||||||
alter type insenum add 'i20' before 'L2';
|
alter type insenum add value 'i20' before 'L2';
|
||||||
alter type insenum add 'i21' before 'L2';
|
alter type insenum add value 'i21' before 'L2';
|
||||||
alter type insenum add 'i22' before 'L2';
|
alter type insenum add value 'i22' before 'L2';
|
||||||
alter type insenum add 'i23' before 'L2';
|
alter type insenum add value 'i23' before 'L2';
|
||||||
alter type insenum add 'i24' before 'L2';
|
alter type insenum add value 'i24' before 'L2';
|
||||||
alter type insenum add 'i25' before 'L2';
|
alter type insenum add value 'i25' before 'L2';
|
||||||
alter type insenum add 'i26' before 'L2';
|
alter type insenum add value 'i26' before 'L2';
|
||||||
alter type insenum add 'i27' before 'L2';
|
alter type insenum add value 'i27' before 'L2';
|
||||||
alter type insenum add 'i28' before 'L2';
|
alter type insenum add value 'i28' before 'L2';
|
||||||
alter type insenum add 'i29' before 'L2';
|
alter type insenum add value 'i29' before 'L2';
|
||||||
alter type insenum add 'i30' before 'L2';
|
alter type insenum add value 'i30' before 'L2';
|
||||||
|
|
||||||
-- The exact values of enumsortorder will now depend on the local properties
|
-- The exact values of enumsortorder will now depend on the local properties
|
||||||
-- of float4, but in any reasonable implementation we should get at least
|
-- of float4, but in any reasonable implementation we should get at least
|
||||||
|
Loading…
x
Reference in New Issue
Block a user