Thread: Error from index "pg_type_typname_index"????

Error from index "pg_type_typname_index"????

From
fabrizio.ermini@sysdat.it
Date:
Hi all...

I've a postgresql 7.0.2 used as a backend for a website. Randomly,
and not very frequently, an error pops up saying that the following
problem has happened:

ERROR: Cannot insert a duplicate key into unique index
pg_type_typname_index

The query causing it it's an innocent query that duplicates a table
in a temporary one, i.e.

"select * into forum_clone from forums"

That of course doesn't cause any problem 99% of the time. The
fact that it happens doesn't seem to be related to load, neither
vacuumize the db seems to change anything.

Now my question is: anybody has a hint on what mey be
happening in that darn 1%???

TIA,
Ciao!


/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/

Fabrizio Ermini               Alternate E-mail:
C.so Umberto, 7               faermini@tin.it
loc. Meleto Valdarno          Mail on GSM: (keep it short!)
52020 Cavriglia (AR)          faermini@sms.tin.it

Re: Error from index "pg_type_typname_index"????

From
Tom Lane
Date:
fabrizio.ermini@sysdat.it writes:
> I've a postgresql 7.0.2 used as a backend for a website. Randomly,
> and not very frequently, an error pops up saying that the following
> problem has happened:
> ERROR: Cannot insert a duplicate key into unique index
> pg_type_typname_index
> The query causing it it's an innocent query that duplicates a table
> in a temporary one, i.e.
> "select * into forum_clone from forums"

I think you're probably trying to do two of these at the same time.

Table creation also creates an entry in pg_type for the table's row
type, and IIRC that happens before the pg_class entry is made.
Example:

session 1:

regression=# begin;
BEGIN
regression=# create table foot (f1 int);
CREATE

session 2:

regression=# create table foot (f1 int);
<< blocks waiting to see if session 1 commits or not >>

session 1 again:

regression=# end;
COMMIT

now session 2 reports:

ERROR:  Cannot insert a duplicate key into unique index pg_type_typname_index

Session 2's check to see if the table name already existed didn't find a
conflict because session 1 hadn't committed yet; it was only the first
insert into a unique index that caused a synchronization point.

I'll take a look to see if the order of operations can't be reversed so
that you get a more understandable complaint about a unique index on
pg_class in this case.  However, the real answer for you is to be using
a TEMP table if you are going to have multiple clients creating
temporary tables at about the same time.  That avoids the name conflict.

            regards, tom lane

Re: Error from index "pg_type_typname_index"????

From
fabrizio.ermini@sysdat.it
Date:
On 12 Feb 2001, at 10:10, Tom Lane wrote:

> > ERROR: Cannot insert a duplicate key into unique index
> > pg_type_typname_index
> > The query causing it it's an innocent query that duplicates a table
> > in a temporary one, i.e.
> > "select * into forum_clone from forums"
>
> I think you're probably trying to do two of these at the same time.
>
And you do think right. (And this should not came as a surprise, I
would add :-)).
I've ascertained it doing a little stress-testing, and simply rethinking
on the fact that I was doing a dumb thing...

> I'll take a look to see if the order of operations can't be reversed so
> that you get a more understandable complaint about a unique index on
> pg_class in this case.  However, the real answer for you is to be using
> a TEMP table if you are going to have multiple clients creating
> temporary tables at about the same time.  That avoids the name conflict.
>

Nope. This is the first thing I've tried after I've realized what was
happening, but it does not work in a web environment, at least in a
PHP based like mine; I think it scales down to PHP ways of
optimizing connection pool (which, in effect, have given me some
worry over time): if use a TEMP table and try to stress test the
page (i.e. "hit furiosly F5 cycling to several explorer windows with
the mouse" :-)) i got many errors complaining things such "table
doesn't exist" or similar. Evidently the various TEMP tables of the
various pages where mismatching, since they have a lifetime based
on the concept of a "session" that's not 1:1 with the lifetime of a
web page.

I resorted to handle the creation of the various tables at application
level, creating temp tablenames with uniqueid() function. A little
overhead but it works well.

Summarizing all this thoughts, the moral is that it's not been PG's
fault (unless for a less-than-clear error message, but that's a venial
sin :-)), that I should think more before screaming wolf, and that I
really should study better the way PHP handles PG connection...
there's some "hidden magic" in there that doesn't convince me.

Thanks for you attention, as ever, and
Ciao

Fabrizio



/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/

Fabrizio Ermini               Alternate E-mail:
C.so Umberto, 7               faermini@tin.it
loc. Meleto Valdarno          Mail on GSM: (keep it short!)
52020 Cavriglia (AR)          faermini@sms.tin.it