Thread: Potential bug in ALTER TABLE?

Potential bug in ALTER TABLE?

From
Jeroen Ruigrok/asmodai
Date:
Hi,

just want to verify first with you guys before dumping it on the bugs
list.  Most likely I am just being silly here or something.

Take this:

create table blah (name TEXT CHECK (name IN ('blah', 'bleh')));
test=# \d blah   Table "public.blah"Column | Type | Modifiers 
--------+------+-----------name   | text | 
Check constraints: "blah_name" ((name = 'blah'::text) OR (name = 'bleh'::text))

As we would expect PostgreSQL to do.  The constraint has an
automatically assigned name.

Now, to continue:

ALTER TABLE blah DROP CONSTRAINT blah_name;
ALTER TABLE blah ADD CHECK (name IN ('blah', 'bleh'));
test=# \d blah   Table "public.blah"Column | Type | Modifiers 
--------+------+-----------name   | text | 
Check constraints: "$1" ((name = 'blah'::text) OR (name = 'bleh'::text))

And this time around PostgreSQL doesn't assign an automatic name.
Well, it depends on what you call a name, but $1, $2, and so on isn't
quite descriptive.  Is this an oversight or am I missing some subtle
thing here?

-- 
Jeroen Ruigrok van der Werven <asmodai(at)wxs.nl> / asmodai
PGP fingerprint: 2D92 980E 45FE 2C28 9DB7  9D88 97E6 839B 2EAC 625B
http://www.tendra.org/   | http://www.in-nomine.org/~asmodai/diary/
Happiness is the absence of the striving for happiness...


Re: Potential bug in ALTER TABLE?

From
Tom Lane
Date:
Jeroen Ruigrok/asmodai <asmodai@wxs.nl> writes:
> just want to verify first with you guys before dumping it on the bugs
> list.  Most likely I am just being silly here or something.

The ALTER ADD CONSTRAINT form creates a table constraint, ie, one that's
not attached to any particular column.  If you write the constraint in
the CREATE TABLE as a table constraint, then you get the same result as
with ALTER ADD CONSTRAINT.

regression=# create table blah (name TEXT, CHECK (name IN ('blah', 'bleh')));
CREATE TABLE
regression=# \d blah   Table "public.blah"Column | Type | Modifiers
--------+------+-----------name   | text |
Check constraints:   "$1" CHECK ((name = 'blah'::text) OR (name = 'bleh'::text))


If you don't like the automatically generated name, assign your own...

regression=# ALTER TABLE blah ADD CONSTRAINT fooey CHECK (name IN ('blah', 'bleh'));
ALTER TABLE
regression=# \d blah   Table "public.blah"Column | Type | Modifiers
--------+------+-----------name   | text |
Check constraints:   "$1" CHECK ((name = 'blah'::text) OR (name = 'bleh'::text))   "fooey" CHECK ((name = 'blah'::text)
OR(name = 'bleh'::text))
 

        regards, tom lane


Re: Potential bug in ALTER TABLE?

From
Andrew Dunstan
Date:
Jeroen Ruigrok/asmodai wrote:

>Hi,
>
>just want to verify first with you guys before dumping it on the bugs
>list.  Most likely I am just being silly here or something.
>
>Take this:
>
>create table blah (name TEXT CHECK (name IN ('blah', 'bleh')));
>test=# \d blah
>    Table "public.blah"
> Column | Type | Modifiers 
>--------+------+-----------
> name   | text | 
>Check constraints: "blah_name" ((name = 'blah'::text) OR (name = 'bleh'::text))
>
>As we would expect PostgreSQL to do.  The constraint has an
>automatically assigned name.
>
>Now, to continue:
>
>ALTER TABLE blah DROP CONSTRAINT blah_name;
>ALTER TABLE blah ADD CHECK (name IN ('blah', 'bleh'));
>test=# \d blah
>    Table "public.blah"
> Column | Type | Modifiers 
>--------+------+-----------
> name   | text | 
>Check constraints: "$1" ((name = 'blah'::text) OR (name = 'bleh'::text))
>
>And this time around PostgreSQL doesn't assign an automatic name.
>Well, it depends on what you call a name, but $1, $2, and so on isn't
>quite descriptive.  Is this an oversight or am I missing some subtle
>thing here?
>
>  
>
You can name it yourself:
 ALTER TABLE blah ADD CONSTRAINT blurfl CHECK (name IN ('blah', 'bleh'));

I do this a lot.

I agree the autogenerated names are less than pretty.

cheers

andrew