pg_dump -a strangeness/bug? (7.1beta5) - Mailing list pgsql-bugs

From Antoine Reid
Subject pg_dump -a strangeness/bug? (7.1beta5)
Date
Msg-id 20010301175242.A4475@wumpus.lan.edmarketing.com
Whole thread Raw
Responses Re: pg_dump -a strangeness/bug? (7.1beta5)
List pgsql-bugs
Hi everybody!

I believe I have found a little buglet in pg_dump utility, as distributed
in 7.1beta5.  Let me describe the environment first:


This is an x86 machine (AMD K6-2) with 128MB RAM.

Running Debian 'unstable', updated almost every day.

The following (relevant?) packages are installed:

    openssl        0.9.6-1
    libssl096    0.9.6-1
    libssl096-dev    0.9.6-1
    tcl83        8.3.2-6
    tcl83-dev    8.3.2-6
    tk83        8.3.2-3
    tk83-dev    8.3.2-6

PostgreSQL 7.1 beta 5, compiled from sources.  Here is the exact build
incantation:

    ./configure  --prefix=/usr/local/pgsql --with-tcl --with-perl \
    --with-CXX --with-openssl=/usr/include/openssl --with-gnu-ld \
    --with-odbc --enable-syslog --with-tclconfig=/usr/lib/tcl8.3 \
    --with-tkconfig=/usr/lib/tk8.3 --with-includes=/usr/include/tcl8.3

The options --with-tclconfig, --with-tkconfig and --with-includes is
necessary because those tcl and tk packages now have their own subdirs in
/usr/include and /usr/lib to allow concurrent versions to exist on the
system.  Please note I am not using any .deb packages for PostgreSQL.

Now, the bug report itself...
I have tried to cover all bases here.
See my comments after the "-- END BUG REPORT --" line..

-- START BUG REPORT --

pgsql@wumpus(pts/3)(0):~% echo $PGDATA
/usr/local/pgsql/data
pgsql@wumpus(pts/3)(0):~% echo $PGHOST
localhost
pgsql@wumpus(pts/3)(0):~% echo $PGLIB
/usr/local/pgsql/lib
pgsql@wumpus(pts/3)(0):~% which psql
/usr/local/pgsql/bin/psql
pgsql@wumpus(pts/3)(0):~% grep 127.0.0.1 /usr/local/pgsql/data/pg_hba.conf
host         all         127.0.0.1     255.255.255.255     ident sameuser
pgsql@wumpus(pts/3)(0):~% psql -l
 List of databases
 Database  | Owner
-----------+-------
 template0 | pgsql
 template1 | pgsql
(2 rows)

pgsql@wumpus(pts/3)(0):~% createdb testbug
CREATE DATABASE
pgsql@wumpus(pts/3)(0):~% psql testbug
Welcome to psql, the PostgreSQL interactive terminal.

Type:  \copyright for distribution terms
       \h for help with SQL commands
       \? for help on internal slash commands
       \g or terminate with semicolon to execute query
       \q to quit

testbug=# SELECT version();
                             version
------------------------------------------------------------------
 PostgreSQL 7.1beta5 on i586-pc-linux-gnu, compiled by GCC 2.95.3
(1 row)

testbug=# CREATE TABLE table1 (
testbug(# attribute1 SERIAL NOT NULL PRIMARY KEY,
testbug(# attribute2 TEXT
testbug(# );
NOTICE:  CREATE TABLE will create implicit sequence 'table1_attribute1_seq' for SERIAL column 'table1.attribute1'
NOTICE:  CREATE TABLE/PRIMARY KEY will create implicit index 'table1_pkey' for table 'table1'
CREATE
testbug=# \q
pgsql@wumpus(pts/3)(0):~% which pg_dump
/usr/local/pgsql/bin/pg_dump
pgsql@wumpus(pts/3)(0):~% pg_dump -a testbug
--
-- Selected TOC Entries:
--
\connect - pgsql
--
pgsql@wumpus(pts/3)(0):~% pg_dump -a testbug
--
-- Selected TOC Entries:
--
\connect - pgsql
--
-- TOC Entry ID 1 (OID 18772)
--
-- Name: "table1_attribute1_seq" Type: SEQUENCE Owner: pgsql
--

CREATE SEQUENCE "table1_attribute1_seq" start 1 increment 1 maxvalue 2147483647 minvalue 1  cache 1 ;

--
-- TOC Entry ID 3 (OID 18772)
--
-- Name: "table1_attribute1_seq" Type: SEQUENCE Owner: pgsql
--

CREATE SEQUENCE "table1_attribute1_seq" start 1 increment 1 maxvalue 2147483647 minvalue 1  cache 1 ;

--
-- Data for TOC Entry ID 5 (OID 18791) TABLE DATA table1
--

-- Disable triggers
UPDATE "pg_class" SET "reltriggers" = 0 WHERE "relname" ~* 'table1';
COPY "table1"  FROM stdin;
\.
-- Enable triggers
BEGIN TRANSACTION;
CREATE TEMP TABLE "tr" ("tmp_relname" name, "tmp_reltriggers" smallint);
INSERT INTO "tr" SELECT C."relname", count(T."oid") FROM "pg_class" C, "pg_trigger" T WHERE C."oid" = T."tgrelid" AND
C."relname"~* 'table1'  GROUP BY 1; 
UPDATE "pg_class" SET "reltriggers" = TMP."tmp_reltriggers" FROM "tr" TMP WHERE "pg_class"."relname" =
TMP."tmp_relname";
DROP TABLE "tr";
COMMIT TRANSACTION;

--
-- TOC Entry ID 2 (OID 18772)
--
-- Name: "table1_attribute1_seq" Type: SEQUENCE SET Owner:
--

SELECT setval ('"table1_attribute1_seq"', 1, 'f');

--
-- TOC Entry ID 4 (OID 18772)
--
-- Name: "table1_attribute1_seq" Type: SEQUENCE SET Owner:
--

SELECT setval ('"table1_attribute1_seq"', 1, 'f');

pgsql@wumpus(pts/3)(0):~%

-- END BUG REPORT --



OK.. Here we go:

I create a brand new database.
I create a new (simple) table, that will implicitly create a sequence.

I don't insert any data.

The problem is within the output of "pg_dump -a testbug"

Note: calling "pg_dump testbug" does not show the problem.

The problem exists only when the "-a" option is given.  Taken from
pg_dump --help, -a should give me only the data, not the schema creation
queries.

However, if you notice above, it CREATEs the SEQUENCE, and twice!
It also sets the sequence value twice!

Now, I would expect it to only COPY the data in the different tables, and
set the values of the different sequences.  Maybe my expectations are
wrong, but at least, it ought not to do it TWICE... :-/

Can someone confirm whether this is a bug? I have tried on many different
systems here, and it looks like this bug was there in beta4 and beta3 as
well. I haven't checked earlier versions (in particular, I didn't check
whether 7.0.3 had this behavior or not).

If someone goes there and fixes the code, maybe the code could be optimized
not to put any COPY at all for a table if it is empty?  Either issue a
SELECT COUNT(*) FROM foo  before, or just checking if it got an empty
recordset when fetching the data? It seems to me we could spare disabling
triggers, creating a temp table, doing an empty copy and re-enabling
triggers.. Comments?

Any more details available upon request.

Thanks
Antoine Reid

--
 O          Antoine Reid             O>  Any sufficiently perverted  <O>
<|>    System and Network Admin     <|         perl script is         |
 >\ antoiner@hansonpublications.com  >\ indistinguishable from Magic /<

pgsql-bugs by date:

Previous
From: "Creager, Robert S"
Date:
Subject: 7.1Beta 4&5 - clean build problem with '--with-perl'
Next
From: Joncheng Kuo
Date:
Subject: Installation bug