]> 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:19:49 +0000 (16:19 -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.

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

index bbb14a1b6624d6531aa87181b8dbe93d13980b4a..5a44b05c46b3d2ac375a09616c9a8d0d6a94daa0 100644 (file)
@@ -11,7 +11,9 @@ OBJS = check.o controldata.o dump.o exec.o file.o function.o info.o \
 PG_CPPFLAGS  = -DFRONTEND -DDLSUFFIX=\"$(DLSUFFIX)\" -I$(srcdir) -I$(libpq_srcdir)
 PG_LIBS = $(libpq_pgport)
 
-EXTRA_CLEAN = analyze_new_cluster.sh delete_old_cluster.sh log/ tmp_check/
+EXTRA_CLEAN = analyze_new_cluster.sh delete_old_cluster.sh log/ tmp_check/ \
+              pg_upgrade_dump_globals.sql \
+              pg_upgrade_dump_*.custom pg_upgrade_*.log
 
 ifdef USE_PGXS
 PG_CONFIG = pg_config
index 5c41c0aa5cb268a45f483f046b720101564086b5..3803c68cb5552632f69b42a224c9b88c4e85594c 100644 (file)
@@ -13777,8 +13777,8 @@ dumpConstraint(Archive *fout, 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 14fc7ebb530854580698f97b47e961680a7281f1..0d5522865593cef19ad6b2dc96841606d4079ca6 100644 (file)
@@ -436,6 +436,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 55744bfa3d6d5583dbf6b64e9dcdea3c1b3cefa5..4f8e5b22047251ff28ffa3050f59d9c2d14bd006 100644 (file)
@@ -339,6 +339,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