Add some notes about why "ALTER TYPE enum DROP VALUE" is hard.
authorTom Lane <tgl@sss.pgh.pa.us>
Tue, 3 Oct 2023 15:41:42 +0000 (11:41 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Tue, 3 Oct 2023 15:41:42 +0000 (11:41 -0400)
In hopes of putting these where any would-be implementer is sure to
find them, make a placeholder grammar production for ALTER DROP VALUE
and put them there.  This is really just a docs patch, though.

Vik Fearing, with a bit more wordsmithing by me

Discussion: https://postgr.es/m/9fffd149-da0f-0c9c-6745-731fb688642a@postgresfriends.org

src/backend/parser/gram.y

index fec9b2604febc4506f6755a3159b9d6d4ad37279..e56cbe77cb727868c0dcc730d69232d3457269a3 100644 (file)
@@ -6412,6 +6412,33 @@ AlterEnumStmt:
                n->skipIfNewValExists = false;
                $$ = (Node *) n;
            }
+        | ALTER TYPE_P any_name DROP VALUE_P Sconst
+           {
+               /*
+                * The following problems must be solved before this can be
+                * implemented:
+                *
+                * - There must be no instance of the target value in
+                *   any table.
+                *
+                * - The value must not appear in any catalog metadata,
+                *   such as stored view expressions or column defaults.
+                *
+                * - The value must not appear in any non-leaf page of a
+                *   btree (and similar issues with other index types).
+                *   This is problematic because a value could persist
+                *   there long after it's gone from user-visible data.
+                *
+                * - Concurrent sessions must not be able to insert the
+                *   value while the preceding conditions are being checked.
+                *
+                * - Possibly more...
+                */
+               ereport(ERROR,
+                       (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+                        errmsg("dropping an enum value is not implemented"),
+                        parser_errposition(@4)));
+           }
         ;
 
 opt_if_not_exists: IF_P NOT EXISTS              { $$ = true; }