]> granicus.if.org Git - postgresql/commitdiff
Fix pg_dump to handle inherited NOT VALID check constraints correctly.
authorTom Lane <tgl@sss.pgh.pa.us>
Thu, 1 Oct 2015 20:19:49 +0000 (16:19 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Thu, 1 Oct 2015 20:20:13 +0000 (16:20 -0400)
This case seems to have been overlooked when unvalidated check constraints
were introduced, in 9.2.  The code would attempt to dump such constraints
over again for each child table, even though adding them to the parent
table is sufficient.

In 9.2 and 9.3, also fix contrib/pg_upgrade/Makefile so that the "make
clean" target fully cleans up after a failed test.  This evidently got
dealt with at some point in 9.4, but it wasn't back-patched.  I ran into
it while testing this fix ...

Per bug #13656 from Ingmar Brouns.

src/bin/pg_dump/pg_dump.c
src/test/regress/expected/alter_table.out
src/test/regress/sql/alter_table.sql

index 56c256df8a13d874f401a76f5c2c028649cd5d45..ba1683b79a087c1b4c7fabece70cc3a8c56b7ff0 100644 (file)
@@ -14772,8 +14772,8 @@ dumpConstraint(Archive *fout, DumpOptions *dopt, ConstraintInfo *coninfo)
        {
                /* CHECK constraint on a table */
 
-               /* Ignore if not to be dumped separately */
-               if (coninfo->separate)
+               /* Ignore if not to be dumped separately, or if it was inherited */
+               if (coninfo->separate && coninfo->conislocal)
                {
                        /* not ONLY since we want it to propagate to children */
                        appendPQExpBuffer(q, "ALTER TABLE %s\n",
index 28422eaaf01430c1c8408b1619d884ccccc8932a..44ce6f564914e57f2c88db318f8a2b08a532ee6d 100644 (file)
@@ -438,6 +438,19 @@ explain (costs off) select * from nv_parent where d between '2009-08-01'::date a
          Filter: ((d >= '08-01-2009'::date) AND (d <= '08-31-2009'::date))
 (7 rows)
 
+-- add an inherited NOT VALID constraint
+alter table nv_parent add check (d between '2001-01-01'::date and '2099-12-31'::date) not valid;
+\d nv_child_2009
+Table "public.nv_child_2009"
+ Column | Type | Modifiers 
+--------+------+-----------
+ d      | date | 
+Check constraints:
+    "nv_child_2009_d_check" CHECK (d >= '01-01-2009'::date AND d <= '12-31-2009'::date)
+    "nv_parent_d_check" CHECK (d >= '01-01-2001'::date AND d <= '12-31-2099'::date) NOT VALID
+Inherits: nv_parent
+
+-- we leave nv_parent and children around to help test pg_dump logic
 -- Foreign key adding test with mixed types
 -- Note: these tables are TEMP to avoid name conflicts when this test
 -- is run in parallel with foreign_key.sql.
index 3ef55d943163314d11d3cdb472c4d35f4d5452be..778791d9fd182a854bbc994524883834dc95ff77 100644 (file)
@@ -340,6 +340,10 @@ explain (costs off) select * from nv_parent where d between '2009-08-01'::date a
 alter table nv_child_2011 VALIDATE CONSTRAINT nv_child_2011_d_check;
 explain (costs off) select * from nv_parent where d between '2009-08-01'::date and '2009-08-31'::date;
 
+-- add an inherited NOT VALID constraint
+alter table nv_parent add check (d between '2001-01-01'::date and '2099-12-31'::date) not valid;
+\d nv_child_2009
+-- we leave nv_parent and children around to help test pg_dump logic
 
 -- Foreign key adding test with mixed types