diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c index 9e8b1cc49bc..339f27840f8 100644 --- a/src/backend/catalog/index.c +++ b/src/backend/catalog/index.c @@ -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. diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index 70e408cb6ea..6ff08a29cc1 100644 --- a/src/backend/commands/tablecmds.c +++ b/src/backend/commands/tablecmds.c @@ -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 */ diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c index 4399a274465..70721a272d0 100644 --- a/src/backend/commands/trigger.c +++ b/src/backend/commands/trigger.c @@ -459,7 +459,7 @@ CreateTrigger(CreateTrigStmt *stmt, const char *queryString, NULL, true, /* islocal */ 0, /* inhcount */ - false); /* isnoinherit */ + true); /* isnoinherit */ } /* diff --git a/src/test/regress/expected/inherit.out b/src/test/regress/expected/inherit.out index 6613fea84ac..d1c2eec9d08 100644 --- a/src/test/regress/expected/inherit.out +++ b/src/test/regress/expected/inherit.out @@ -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 -- diff --git a/src/test/regress/sql/inherit.sql b/src/test/regress/sql/inherit.sql index 6e6921aa9cd..5f607603252 100644 --- a/src/test/regress/sql/inherit.sql +++ b/src/test/regress/sql/inherit.sql @@ -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 --