Bug report in 7.4

From: Gregory Stark <gsstark(at)mit(dot)edu>
To: Postgresql-General <pgsql-general(at)postgresql(dot)org>
Subject: Bug report in 7.4
Date: 2005-01-24 19:05:15
Message-ID: 87k6q24phw.fsf@stark.xeocode.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general


Is this known? If you create a table with a SERIAL and then rename the table
you can't dump/restore the database. The create table creates a sequence based
on the new table name but the setval() call still refers to the old sequence
name.

I'm not really sure which sequence name ought to be used. Personally I'm
pretty attached to the idea that pg_dump recreates the same database, not just
a functionally equivalent one. You could imagine someone calling currval() on
the sequence by name for example. But you could also look at SERIAL as more
than just syntactic sugar and the sequence it creates as an internal thing.

$ psql -d template1 -U postgres
Welcome to psql 7.4.6, the PostgreSQL interactive terminal.

template1=# create database test2 with template = template0;
CREATE DATABASE

template1=# \q

$ psql -d test2 -U postgres
Welcome to psql 7.4.6, the PostgreSQL interactive terminal.

test2=# create table test (foo serial);
NOTICE: CREATE TABLE will create implicit sequence "test_foo_seq" for "serial" column "test.foo"
CREATE TABLE

test2=# alter table test rename to test2;
ALTER TABLE

test2=# \d test2
Table "public.test2"
Column | Type | Modifiers
--------+---------+-------------------------------------------------------
foo | integer | not null default nextval('public.test_foo_seq'::text)

test2=# \q

$ pg_dump -U postgres -Fc -f test.dmp test2

template1=# drop database test2;
DROP DATABASE

template1=# create database test2 with template=template0;
CREATE DATABASE

template1=# \q

$ pg_restore -d test2 -f test2.dmp
...
pg_restore: NOTICE: CREATE TABLE will create implicit sequence "test2_t_seq" for "serial" column "test2.t"
pg_restore: [archiver (db)] could not execute query: ERROR: relation "test_t_seq" does not exist

Repeating the process without -Fc shows:

$ pg_dump -U postgres -f test2.dmp test2

$ cat test2.dmp
...
CREATE TABLE test2 (
foo serial NOT NULL
);
...
SELECT pg_catalog.setval('test_foo_seq', 1, false);

$ psql -d test2 -U postgres -f test2.dmp
SET
SET
SET
REVOKE
GRANT
SET
SET
psql:test2.dmp:30: NOTICE: CREATE TABLE will create implicit sequence "test2_foo_seq" for "serial" column "test2.foo"
CREATE TABLE
psql:test2.dmp:47: ERROR: relation "test_foo_seq" does not exist
COMMENT

--
greg

Responses

Browse pgsql-general by date

  From Date Subject
Next Message John DeSoi 2005-01-24 19:44:12 Re: number of rown in a cursor.
Previous Message Terry Lee Tucker 2005-01-24 18:45:11 Re: disable trigger from transaction