]> 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 dec57a6130d97e3425107c2bba98273d9e2c0c27..e18522e2b53afb169616dfe6d98ff463cf091543 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_*.sql \
+              pg_upgrade_dump_*.custom pg_upgrade_*.log
 
 ifdef USE_PGXS
 PG_CONFIG = pg_config
index f36f579c11e534641b4219e43be60593cd1b9869..d51ca497e95da253b95636b09049fee6a834e4cc 100644 (file)
@@ -13214,8 +13214,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 edf72a74e6e48a997e8e854fea00b1311f291d27..459e4c0f62c2dcd6d6a0e6a03ce1ae29e13c53ff 100644 (file)
@@ -445,6 +445,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))
 (8 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