1
0
mirror of https://github.com/postgres/postgres.git synced 2025-05-05 09:19:17 +03:00

connoinherit may be true only for CHECK constraints

The code was setting it true for other constraints, which is
bogus.  Doing so caused bogus catalog entries for such constraints, and
in particular caused an error to be raised when trying to drop a
constraint of types other than CHECK from a table that has children,
such as reported in bug #6712.

In 9.2, additionally ignore connoinherit=true for other constraint
types, to avoid having to force initdb; existing databases might already
contain bogus catalog entries.

Includes a catversion bump (in HEAD only).

Bug report from Miroslav Šulc
Analysis from Amit Kapila and Noah Misch; Amit also contributed the patch.
This commit is contained in:
Alvaro Herrera 2012-07-20 12:33:34 -04:00
parent d7991a13d8
commit d721f208af
5 changed files with 169 additions and 3 deletions

View File

@ -1156,7 +1156,7 @@ index_constraint_create(Relation heapRelation,
NULL,
true, /* islocal */
0, /* inhcount */
false); /* noinherit */
true); /* noinherit */
/*
* Register the index as internally dependent on the constraint.

View File

@ -6039,7 +6039,7 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
NULL,
true, /* islocal */
0, /* inhcount */
false); /* isnoinherit */
true); /* isnoinherit */
/*
* Create the triggers that will enforce the constraint.
@ -6947,6 +6947,16 @@ ATExecDropConstraint(Relation rel, const char *constrName,
is_no_inherit_constraint = con->connoinherit;
/*
* XXX as a special hack, we turn on no-inherit here unconditionally
* except for CHECK constraints. This is because 9.2 until beta2
* contained a bug that marked it false for all constraints, even
* though it was only supported false for CHECK constraints.
* See bug #6712.
*/
if (con->contype != CONSTRAINT_CHECK)
is_no_inherit_constraint = true;
/*
* Perform the actual constraint deletion
*/

View File

@ -459,7 +459,7 @@ CreateTrigger(CreateTrigStmt *stmt, const char *queryString,
NULL,
true, /* islocal */
0, /* inhcount */
false); /* isnoinherit */
true); /* isnoinherit */
}
/*

View File

@ -970,6 +970,126 @@ DETAIL: drop cascades to table inht2
drop cascades to table inhts
drop cascades to table inht3
drop cascades to table inht4
-- Test non-inheritable indices [UNIQUE, EXCLUDE] contraints
CREATE TABLE test_constraints (id int, val1 varchar, val2 int, UNIQUE(val1, val2));
NOTICE: CREATE TABLE / UNIQUE will create implicit index "test_constraints_val1_val2_key" for table "test_constraints"
CREATE TABLE test_constraints_inh () INHERITS (test_constraints);
\d+ test_constraints
Table "public.test_constraints"
Column | Type | Modifiers | Storage | Stats target | Description
--------+-------------------+-----------+----------+--------------+-------------
id | integer | | plain | |
val1 | character varying | | extended | |
val2 | integer | | plain | |
Indexes:
"test_constraints_val1_val2_key" UNIQUE CONSTRAINT, btree (val1, val2)
Child tables: test_constraints_inh
Has OIDs: no
ALTER TABLE ONLY test_constraints DROP CONSTRAINT test_constraints_val1_val2_key;
\d+ test_constraints
Table "public.test_constraints"
Column | Type | Modifiers | Storage | Stats target | Description
--------+-------------------+-----------+----------+--------------+-------------
id | integer | | plain | |
val1 | character varying | | extended | |
val2 | integer | | plain | |
Child tables: test_constraints_inh
Has OIDs: no
\d+ test_constraints_inh
Table "public.test_constraints_inh"
Column | Type | Modifiers | Storage | Stats target | Description
--------+-------------------+-----------+----------+--------------+-------------
id | integer | | plain | |
val1 | character varying | | extended | |
val2 | integer | | plain | |
Inherits: test_constraints
Has OIDs: no
DROP TABLE test_constraints_inh;
DROP TABLE test_constraints;
CREATE TABLE circles (
c circle,
EXCLUDE USING gist (c WITH &&)
);
NOTICE: CREATE TABLE / EXCLUDE will create implicit index "circles_c_excl" for table "circles"
CREATE TABLE circles_inh () INHERITS (circles);
\d+ circles
Table "public.circles"
Column | Type | Modifiers | Storage | Stats target | Description
--------+--------+-----------+---------+--------------+-------------
c | circle | | plain | |
Indexes:
"circles_c_excl" EXCLUDE USING gist (c WITH &&)
Child tables: circles_inh
Has OIDs: no
ALTER TABLE circles DROP CONSTRAINT circles_c_excl;
\d+ circles
Table "public.circles"
Column | Type | Modifiers | Storage | Stats target | Description
--------+--------+-----------+---------+--------------+-------------
c | circle | | plain | |
Child tables: circles_inh
Has OIDs: no
\d+ circles_inh
Table "public.circles_inh"
Column | Type | Modifiers | Storage | Stats target | Description
--------+--------+-----------+---------+--------------+-------------
c | circle | | plain | |
Inherits: circles
Has OIDs: no
DROP TABLE circles_inh;
DROP TABLE circles;
-- Test non-inheritable foreign key contraints
CREATE TABLE test_primary_constraints(id int PRIMARY KEY);
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "test_primary_constraints_pkey" for table "test_primary_constraints"
CREATE TABLE test_foreign_constraints(id1 int REFERENCES test_primary_constraints(id));
CREATE TABLE test_foreign_constraints_inh () INHERITS (test_foreign_constraints);
\d+ test_primary_constraints
Table "public.test_primary_constraints"
Column | Type | Modifiers | Storage | Stats target | Description
--------+---------+-----------+---------+--------------+-------------
id | integer | not null | plain | |
Indexes:
"test_primary_constraints_pkey" PRIMARY KEY, btree (id)
Referenced by:
TABLE "test_foreign_constraints" CONSTRAINT "test_foreign_constraints_id1_fkey" FOREIGN KEY (id1) REFERENCES test_primary_constraints(id)
Has OIDs: no
\d+ test_foreign_constraints
Table "public.test_foreign_constraints"
Column | Type | Modifiers | Storage | Stats target | Description
--------+---------+-----------+---------+--------------+-------------
id1 | integer | | plain | |
Foreign-key constraints:
"test_foreign_constraints_id1_fkey" FOREIGN KEY (id1) REFERENCES test_primary_constraints(id)
Child tables: test_foreign_constraints_inh
Has OIDs: no
ALTER TABLE test_foreign_constraints DROP CONSTRAINT test_foreign_constraints_id1_fkey;
\d+ test_foreign_constraints
Table "public.test_foreign_constraints"
Column | Type | Modifiers | Storage | Stats target | Description
--------+---------+-----------+---------+--------------+-------------
id1 | integer | | plain | |
Child tables: test_foreign_constraints_inh
Has OIDs: no
\d+ test_foreign_constraints_inh
Table "public.test_foreign_constraints_inh"
Column | Type | Modifiers | Storage | Stats target | Description
--------+---------+-----------+---------+--------------+-------------
id1 | integer | | plain | |
Inherits: test_foreign_constraints
Has OIDs: no
DROP TABLE test_foreign_constraints_inh;
DROP TABLE test_foreign_constraints;
DROP TABLE test_primary_constraints;
--
-- Test parameterized append plans for inheritance trees
--

View File

@ -291,6 +291,42 @@ SELECT a.attrelid::regclass, a.attname, a.attinhcount, e.expected
DROP TABLE inht1, inhs1 CASCADE;
-- Test non-inheritable indices [UNIQUE, EXCLUDE] contraints
CREATE TABLE test_constraints (id int, val1 varchar, val2 int, UNIQUE(val1, val2));
CREATE TABLE test_constraints_inh () INHERITS (test_constraints);
\d+ test_constraints
ALTER TABLE ONLY test_constraints DROP CONSTRAINT test_constraints_val1_val2_key;
\d+ test_constraints
\d+ test_constraints_inh
DROP TABLE test_constraints_inh;
DROP TABLE test_constraints;
CREATE TABLE circles (
c circle,
EXCLUDE USING gist (c WITH &&)
);
CREATE TABLE circles_inh () INHERITS (circles);
\d+ circles
ALTER TABLE circles DROP CONSTRAINT circles_c_excl;
\d+ circles
\d+ circles_inh
DROP TABLE circles_inh;
DROP TABLE circles;
-- Test non-inheritable foreign key contraints
CREATE TABLE test_primary_constraints(id int PRIMARY KEY);
CREATE TABLE test_foreign_constraints(id1 int REFERENCES test_primary_constraints(id));
CREATE TABLE test_foreign_constraints_inh () INHERITS (test_foreign_constraints);
\d+ test_primary_constraints
\d+ test_foreign_constraints
ALTER TABLE test_foreign_constraints DROP CONSTRAINT test_foreign_constraints_id1_fkey;
\d+ test_foreign_constraints
\d+ test_foreign_constraints_inh
DROP TABLE test_foreign_constraints_inh;
DROP TABLE test_foreign_constraints;
DROP TABLE test_primary_constraints;
--
-- Test parameterized append plans for inheritance trees
--