agora inbox for [email protected]  
help / color / mirror / Atom feed
From: Alvaro Herrera <[email protected]>
Subject: [PATCH] Fix deferred constraints on partitioned rels
Date: Tue, 5 Nov 2019 12:52:27 -0300

---
 src/backend/commands/trigger.c | 29 ++++++++++++++++++++++-------
 1 file changed, 22 insertions(+), 7 deletions(-)

diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c
index 57c98912d5..5e302fee64 100644
--- a/src/backend/commands/trigger.c
+++ b/src/backend/commands/trigger.c
@@ -5362,6 +5362,7 @@ AfterTriggerSetState(ConstraintsSetStmt *stmt)
 		Relation	conrel;
 		Relation	tgrel;
 		List	   *conoidlist = NIL;
+		List	   *pcl = NIL;
 		List	   *tgoidlist = NIL;
 		ListCell   *lc;
 
@@ -5440,7 +5441,18 @@ AfterTriggerSetState(ConstraintsSetStmt *stmt)
 					Form_pg_constraint con = (Form_pg_constraint) GETSTRUCT(tup);
 
 					if (con->condeferrable)
-						conoidlist = lappend_oid(conoidlist, con->oid);
+					{
+						/*
+						 * If we found it and it's deferrable, save it to one
+						 * of the lists depending on whether it belongs to a
+						 * partitioned table.
+						 */
+						if (get_rel_relkind(con->conrelid) ==
+							RELKIND_PARTITIONED_TABLE)
+							pcl = lappend_oid(pcl, con->oid);
+						else
+							conoidlist = lappend_oid(conoidlist, con->oid);
+					}
 					else if (stmt->deferred)
 						ereport(ERROR,
 								(errcode(ERRCODE_WRONG_OBJECT_TYPE),
@@ -5472,12 +5484,12 @@ AfterTriggerSetState(ConstraintsSetStmt *stmt)
 		}
 
 		/*
-		 * Scan for any possible descendants of the constraints.  We append
-		 * whatever we find to the same list that we're scanning; this has the
-		 * effect that we create new scans for those, too, so if there are
-		 * further descendents, we'll also catch them.
+		 * Scan for any possible descendants of constraints in partitioned
+		 * tables.  If we find any that are on further partitioned tables,
+		 * append them to the list we're scanning.  This ensures we process
+		 * all descendant relations.
 		 */
-		foreach(lc, conoidlist)
+		foreach(lc, pcl)
 		{
 			Oid			parent = lfirst_oid(lc);
 			ScanKeyData key;
@@ -5495,7 +5507,10 @@ AfterTriggerSetState(ConstraintsSetStmt *stmt)
 			{
 				Form_pg_constraint con = (Form_pg_constraint) GETSTRUCT(tuple);
 
-				conoidlist = lappend_oid(conoidlist, con->oid);
+				if (get_rel_relkind(con->conrelid) == RELKIND_PARTITIONED_TABLE)
+					pcl = lappend_oid(pcl, con->oid);
+				else
+					conoidlist = lappend_oid(conoidlist, con->oid);
 			}
 
 			systable_endscan(scan);
-- 
2.20.1


--EeQfGwPcQSOJBaQU--





view thread (9+ messages)  latest in thread

reply

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Reply to all the recipients using the --to and --cc options:
  reply via email

  To: [email protected]
  Cc: [email protected]
  Subject: Re: [PATCH] Fix deferred constraints on partitioned rels
  In-Reply-To: <no-message-id-1882344@localhost>

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

This inbox is served by agora; see mirroring instructions
for how to clone and mirror all data and code used for this inbox