BUG #3965: UNIQUE constraint fails on long column values - Mailing list pgsql-bugs

From Juho Saarikko
Subject BUG #3965: UNIQUE constraint fails on long column values
Date
Msg-id 200802181130.m1IBUNdu060026@wwwmaster.postgresql.org
Whole thread Raw
Responses Re: BUG #3965: UNIQUE constraint fails on long column values  (Gregory Stark <stark@enterprisedb.com>)
Re: BUG #3965: UNIQUE constraint fails on long column values  (Bruce Momjian <bruce@momjian.us>)
Re: BUG #3965: UNIQUE constraint fails on long column values  ("Heikki Linnakangas" <heikki@enterprisedb.com>)
List pgsql-bugs
The following bug has been logged online:

Bug reference:      3965
Logged by:          Juho Saarikko
Email address:      juhos@mbnet.fi
PostgreSQL version: 8.3RC2
Operating system:   Linux
Description:        UNIQUE constraint fails on long column values
Details:

It is impossible to add an UNIQUE constraint which includes columns with
long values. The reason seems to be that UNIQUE is implemented using b-tree
index, which cannot handle values longer than 8191 bytes.

While I didn't test, I'd imagine that this would also mean that any attempt
to insert such values to an already unique column would fail.

It is propably impossible to fix this in a simple way, since it is an
inherent result of the underlying storage specification rather than a mere
programming error, so the documentation needs to be updated to warn about
this.

I suggest implementing unique hash indexes and automatically creating one
(and turning the b-tree index into a non-unique one) when a large value is
inserted to fix this. Alternatively, fix b-trees so they can handle large
values; however, a hash index should be far more efficient for this specific
case, since the size of a hash is independent of pre-hash data size.


Exact error message:
******************
kuvat=# alter table pictures ADD constraint pic_unique unique (safe);
NOTICE:  00000: ALTER TABLE / ADD UNIQUE will create implicit index
"pic_unique" for table "pictures"
LOCATION:  DefineIndex, indexcmds.c:434
ERROR:  54000: index row requires 47148 bytes, maximum size is 8191
LOCATION:  index_form_tuple, indextuple.c:170

pgsql-bugs by date:

Previous
From: Tom Lane
Date:
Subject: Re: [PATCH] Don't bail with legitimate -N/-B options
Next
From: Alexandra Nitzschke
Date:
Subject: Bug (#3484) - Missing pg_clog/0AE6