Bad interaction between pg_dump/pg_restore and table inheritance

From: "Rich Schaaf" <rschaaf(at)commoninf(dot)com>
To: <pgsql-bugs(at)postgresql(dot)org>
Subject: Bad interaction between pg_dump/pg_restore and table inheritance
Date: 2016-03-10 19:44:39
Message-ID: 011001d17b05$4e70c000$eb524000$@commoninf.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-bugs

PostgreSQL Version: PostgreSQL 9.4.1, compiled by Visual C++ build 1800,
64-bit

OS Version: Windows 7 Professional, SP 1

Short Description:

Bad interaction between pg_dump/pg_restore and table inheritance

Details:

Using pg_dump/pg_restore can lead to changes in a constraint definition such
that inheritance no longer works.

The following steps (see below for SQL statements) may be followed to
reproduce the problem. The basic idea is:

1. Create two tables (test_master and test_sub) that have the same
column names/data types and the same check constraint definition.

2. Alter test_sub to inherit from test_master and verify that a SELECT
on the test_master table works.

3. Use pg_dump to export the schema containing the two tables

4. Use pg_restore to restore the schema

5. Recreate the test_sub table

6. Attempt to alter test_sub to inherit from test_master. The ALTER
statements fails with the following error;
ERROR: child table "test_sub" has different definition for check constraint
"yn_check"

DROP SCHEMA IF EXISTS test_check CASCADE;

CREATE SCHEMA test_check;

CREATE TABLE test_check.test_master (

descript VARCHAR(10),

yn VARCHAR(1),

CONSTRAINT yn_check CHECK (yn IN ('Y', 'N')));

DROP TABLE IF EXISTS test_check.test_sub;

CREATE TABLE test_check.test_sub (

descript VARCHAR(10),

yn VARCHAR(1),

CONSTRAINT yn_check CHECK (yn IN ('Y', 'N')));

INSERT INTO test_check.test_sub (descript, yn) VALUES ('descript1', 'Y');

ALTER TABLE test_check.test_sub INHERIT test_check.test_master;

-- Verify the query returns the expected result of one row

SELECT * FROM test_check.test_master;

-- Export the test_check schema

-- C:\Program Files (x86)\pgAdmin III\1.20\pg_dump.exe --host localhost
--port 5432 --username "ldx" --no-password --format custom --verbose --file
"C:\Temp\test_check.backup" --schema "test_check" "ldx"

-- Rename the original schema

ALTER SCHEMA test_check RENAME TO test_check_orig;

-- Create a new schema named test_check

CREATE SCHEMA test_check;

-- Import the data from the backup file

-- C:\Program Files (x86)\pgAdmin III\1.20\pg_restore.exe --host localhost
--port 5432 --username "ldx" --dbname "ldx" --no-password --schema
test_check --verbose "C:\Temp\test_check.backup"

-- DROP the imported version of the test_sub table and recreate it

DROP TABLE IF EXISTS test_check.test_sub;

CREATE TABLE test_check.test_sub (

descript VARCHAR(10),

yn VARCHAR(1),

CONSTRAINT yn_check CHECK (yn IN ('Y', 'N')));

INSERT INTO test_check.test_sub (descript, yn) VALUES ('descript1', 'Y');

-- Attempt to set up the inherit relationship with test_master

ALTER TABLE test_check.test_sub INHERIT test_check.test_master;

-- The ALTER TABLE statement returns the following error

-- ERROR: child table "test_sub" has different definition for check
constraint "yn_check"

-- SQL state: 42804

-- Here is the DDL for the original version ot the test_master table:

CREATE TABLE test_check_orig.test_master

(

descript character varying(10),

yn character varying(1),

CONSTRAINT yn_check CHECK (yn::text = ANY (ARRAY['Y'::character varying,
'N'::character varying]::text[]))

)

-- Here is the DDL for the version of the table imported from a schema
backup

CREATE TABLE test_check.test_master

(

descript character varying(10),

yn character varying(1),

CONSTRAINT yn_check CHECK (yn::text = ANY (ARRAY['Y'::character
varying::text, 'N'::character varying::text]))

)

Kind regards,

Rich

Browse pgsql-bugs by date

  From Date Subject
Next Message jkoceniak 2016-03-10 20:50:29 BUG #14015: Query Plan not optimal
Previous Message Tom Lane 2016-03-10 16:24:54 Re: BUG #14009: pg_restore not restoring privilegs when one login/group role is missing