]> granicus.if.org Git - postgresql/commitdiff
Dump foreign keys on partitioned tables
authorAlvaro Herrera <alvherre@alvh.no-ip.org>
Fri, 13 Jul 2018 17:13:26 +0000 (13:13 -0400)
committerAlvaro Herrera <alvherre@alvh.no-ip.org>
Fri, 13 Jul 2018 17:15:29 +0000 (13:15 -0400)
The patch that ended up as commit 3de241dba86f ("Foreign keys on
partitioned tables") lacked pg_dump tests, so the pg_dump code that was
there to support it inadvertently stopped working when in later
development I modified the backend code not to emit pg_trigger rows for
the partitioned table itself.

Bug analysis and code fix is by Michaël.  I (Álvaro) added the test.

Reported-by: amul sul <sulamul@gmail.com>
Co-authored-by: Michaël Paquier <michael@paquier.xyz>
Co-authored-by: Álvaro Herrera <alvherre@alvh.no-ip.org>
Discussion: https://postgr.es/m/CAAJ_b94n=UsNVhgs97vCaWEZAMe-tGDRVuZ73oePQH=eaJKGSA@mail.gmail.com

src/bin/pg_dump/pg_dump.c
src/bin/pg_dump/t/002_pg_dump.pl

index 463639208d6723bbe22cc5f32818bfe119fabe0d..74a1270169dd380e2f61ca1b301473254ffab8ea 100644 (file)
@@ -7131,7 +7131,12 @@ getConstraints(Archive *fout, TableInfo tblinfo[], int numTables)
        {
                TableInfo  *tbinfo = &tblinfo[i];
 
-               if (!tbinfo->hastriggers ||
+               /*
+                * For partitioned tables, foreign keys have no triggers so they
+                * must be included anyway in case some foreign keys are defined.
+                */
+               if ((!tbinfo->hastriggers &&
+                        tbinfo->relkind != RELKIND_PARTITIONED_TABLE) ||
                        !(tbinfo->dobj.dump & DUMP_COMPONENT_DEFINITION))
                        continue;
 
index 7eee870259b8efe7a92559e49e0411b6f1022557..ec751a7c23d1614b647b834dcec7b53ad24038e2 100644 (file)
@@ -631,6 +631,25 @@ my %tests = (
                },
        },
 
+       'ALTER TABLE (partitioned) ADD CONSTRAINT ... FOREIGN KEY' => {
+               create_order => 4,
+               create_sql   => 'CREATE TABLE dump_test.test_table_fk (
+                                                       col1 int references dump_test.test_table)
+                                                       PARTITION BY RANGE (col1);
+                                                       CREATE TABLE dump_test.test_table_fk_1
+                                                       PARTITION OF dump_test.test_table_fk
+                                                       FOR VALUES FROM (0) TO (10);',
+               regexp => qr/
+                       \QADD CONSTRAINT test_table_fk_col1_fkey FOREIGN KEY (col1) REFERENCES dump_test.test_table\E
+                       /xm,
+               like => {
+                       %full_runs, %dump_test_schema_runs, section_post_data => 1,
+               },
+               unlike => {
+                       exclude_dump_test_schema => 1,
+               },
+       },
+
        'ALTER TABLE ONLY test_table ALTER COLUMN col1 SET STATISTICS 90' => {
                create_order => 93,
                create_sql =>