Re: enum bug - Mailing list pgsql-general

From Melvin Davidson
Subject Re: enum bug
Date
Msg-id CANu8Fiw=fJNDuUt25-YuFot=1w-ps-nemgKpmWyQ5Gy8jM=79g@mail.gmail.com
Whole thread Raw
In response to enum bug  (Elein <elein@varlena.com>)
Responses Re: enum bug  ("David G. Johnston" <david.g.johnston@gmail.com>)
Re: enum bug  (Alvaro Herrera <alvherre@2ndquadrant.com>)
List pgsql-general

On Fri, Mar 11, 2016 at 4:36 PM, Elein <elein@varlena.com> wrote:

> Bug/Improvement:
>
>    Enums belong to types, not to column values.
>
>    * Create a built in function, like enum_range( type ), independent of tables
>      that shows a type's enum values.
>        create or replace function enum_range( typein regtype ) returns name[] language sql as
>        $$
>        select array_agg(enumlabel) from
>            (select enumlabel
>            from pg_enum e join pg_type t on (e.enumtypid = t.oid)
>            where t.typtype = 'e' and t.oid = typein
>            order by enumsortorder
>            ) foo;
>        $$;
>    * When an insert into an enum column fails give the person a hint as to valid values
>    * Make enum_range to not be dependent on values in the target table.
>      Remove/Obsolete enum_range( enum_column ) and replace with enum_range( typein regtype )
>
>    Workaround: define the enum_range( typein regtyp ) yourself.
>
>
> create type rainbow as enum ('red','orange','yellow','blue','purple');
> CREATE TYPE
> create table badinfo (color rainbow);
> CREATE TABLE
>
> -- Lousy message.  Show enum list.
> insert into badinfo values ('green');
> ERROR:  invalid input value for enum rainbow: "green"
> LINE 1: insert into badinfo values ('green');
>
>
> -- Lousy message.
> select enum_range(color) from foo;
> enum_range
> ------------
> (0 rows)
>
> insert into foo values ('red');
> INSERT 0 1
> insert into foo values ('blue');
> INSERT 0 1
>
> -- Ooh.  Only shows the enum list for valid value in a table.
> select enum_range(color) from foo;
>           enum_range
> ---------------------------------
> {red,orange,yellow,blue,purple}
> {red,orange,yellow,blue,purple}
> (2 rows)
Elein Mustain
elein@varlena.com
510-637-9106

--
Sent via pgsql-general mailing list (pgsql-general@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-general


Enums are evil!
http://www.lornajane.net/posts/2010/is-enum-evil

enums are from before there were foreign keys
You are better off just making a foreign key contraint.
Things will be a lot simpler.
eg:
    CREATE TABLE rainbow_colors
    ( valid_color varchar(15),
      CONSTRAINT rainbow_colors_pk PRIMARY KEY(valid_color)
    );
   
    CREATE TABLE badinfo
    ( color varchar(15),
      CONSTRAINT badinfo_pk PRIMARY KEY (color),
      CONSTRAINT badinfo_valid FOREIGN KEY (color)
        REFERENCES rainbow_colors (valid_color)
      );
--
Melvin Davidson
I reserve the right to fantasize.  Whether or not you
wish to share my fantasy is entirely up to you.

pgsql-general by date:

Previous
From: Elein
Date:
Subject: enum bug
Next
From: John R Pierce
Date:
Subject: Re: enum bug