Re: BUG #10316: Alter table rename fails if the "new name" starts with '_'

From: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
To: parthibanp2(at)gmail(dot)com
Cc: pgsql-bugs(at)postgresql(dot)org
Subject: Re: BUG #10316: Alter table rename fails if the "new name" starts with '_'
Date: 2014-05-14 17:58:50
Message-ID: 1488.1400090330@sss.pgh.pa.us
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-bugs

parthibanp2(at)gmail(dot)com writes:
> -- I have created one new table with name t1

> test=# \d
> No relations found.
> test=# create table t1 (name varchar(10));
> CREATE TABLE

> -- After that i tried to rename 't1' table as '_t1', now the Postgres server
> saying '_t1' is already exists. i'm sure there is no other table in the
> database other than 't1'.

> test=# alter table t1 rename to _t1;
> ERROR: type "_t1" already exists

Note it's saying *type* _t1 already exists. This is the internal name
of the type t1[], that is, arrays of the rowtype of t1. In general,
our convention for the internal name of an array type is to prepend
a _ to the name of its element type. (There's some logic to choose
a different name if this name is already taken, but that doesn't help
you when it's the array type that got there first.)

> -- Now i renaming table from 't1' to '__t1' and again i renaming from '__t1'
> to '_t1' now its working.

You could have renamed to anything else and then back to _t1; the trick is
just that the table's rowtype and array type have to get renamed out of
the way first. By and large, though, it's probably best to avoid using
table names that begin with an underscore in PG, since you'll tend to
hit this kind of conflict with rowtype names if you do that.

regards, tom lane

In response to

Browse pgsql-bugs by date

  From Date Subject
Next Message David G Johnston 2014-05-14 18:31:35 Re: BUG #10315: Transactions seem to be releasing locks early?
Previous Message Tim Channell 2014-05-14 16:15:13 Re: BUG #10315: Transactions seem to be releasing locks early?