Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Enforce child constraints during COPY TO a partitioned table.
authorRobert Haas <rhaas@postgresql.org>
Fri, 6 Apr 2018 15:42:28 +0000 (11:42 -0400)
committerRobert Haas <rhaas@postgresql.org>
Fri, 6 Apr 2018 15:52:38 +0000 (11:52 -0400)
The previous coding inadvertently checked the constraints for the
partitioned table rather than the target partition, which could
lead to data in a partition that fails to satisfy some constraint
on that partition.  This problem seems to date back to when
table partitioning was introduced; prior to that, there was only
one target table for a COPY, so the problem didn't occur, and the
code just didn't get updated.

Etsuro Fujita, reviewed by Amit Langote and Ashutosh Bapat

Discussion: https://postgr.es/message-id/5ABA4074.1090500%40lab.ntt.co.jp

src/backend/commands/copy.c

index 5d46c9889dd93f08f98bc5e81e62b8c8a89f95eb..00b64e53204eb958e2cb8243651f8e30ef00c911 100644 (file)
@@ -2744,7 +2744,8 @@ CopyFrom(CopyState cstate)
                    check_partition_constr = false;
 
                /* Check the constraints of the tuple */
-               if (cstate->rel->rd_att->constr || check_partition_constr)
+               if (resultRelInfo->ri_RelationDesc->rd_att->constr ||
+                   check_partition_constr)
                    ExecConstraints(resultRelInfo, slot, estate);
 
                if (useHeapMultiInsert)