Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA384:256) (Exim 4.89) (envelope-from ) id 1euPCd-0000zp-3p for pgsql-hackers@arkaria.postgresql.org; Fri, 09 Mar 2018 21:05:23 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.89) (envelope-from ) id 1euPCb-0000QP-UV for pgsql-hackers@arkaria.postgresql.org; Fri, 09 Mar 2018 21:05:21 +0000 Received: from makus.postgresql.org ([2001:4800:1501:1::229]) by malur.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA384:256) (Exim 4.89) (envelope-from ) id 1euPCb-0000Pk-Ja for pgsql-hackers@lists.postgresql.org; Fri, 09 Mar 2018 21:05:21 +0000 Received: from mail-qt0-x241.google.com ([2607:f8b0:400d:c0d::241]) by makus.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.89) (envelope-from ) id 1euPCY-0005Pw-I2 for pgsql-hackers@postgresql.org; Fri, 09 Mar 2018 21:05:20 +0000 Received: by mail-qt0-x241.google.com with SMTP id z14so12561617qti.2 for ; Fri, 09 Mar 2018 13:05:18 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=2ndquadrant-com.20150623.gappssmtp.com; s=20150623; h=date:from:to:cc:subject:message-id:mime-version:content-disposition :content-transfer-encoding:in-reply-to:user-agent; bh=Dxrn8d/Rbfhz9qoR7rhODbLCGgn7KNlf0vA5vwH4Wr8=; b=bC8ynrqiC/JpW57vwG+fY3nb2y/UQYZWauGmKbtw6l+saULDaq3bEqCR8u3UWzHLph +pl4gnWNN84xpcxLhm1IkRCODdM8rZyYNb9YFD7c24nz1fY/138ipO4HfJjqNvK95nj3 3Ed/gfVAHJWWBdJv41mGELfuW0XLJcvjQcOIPWc4I5dO2yoW2/LV7dpMaLdjo6guyDhy K1wXWx0amaEaIw+DTMRSiHSdbyyw8+iUe3Gaez2DkJmASUTdtWNwZRaAi4bv23WAnjg6 tnO0ZXdVLfBXG445B2OjfABzyQGA0xYnEFz7/snnvxMzfvaj2xMNZ9UT1PenYHgVI0fx bzYA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:mime-version :content-disposition:content-transfer-encoding:in-reply-to :user-agent; bh=Dxrn8d/Rbfhz9qoR7rhODbLCGgn7KNlf0vA5vwH4Wr8=; b=RzwhEPdJuPUTG6009t7BOvhytiIVZwuOaDpXRP+A1IqjU1Mvli85i40+VqOdeCd0jN bc3EFbmSEvM6XPDbKXJIuYSGquraAN7ZiRES2GbJk8VOiKzJA0hZdoVNgAJmtsRb4rcI 02cPoVS+IjZynJWI+IM+RCBb1oFGAPBpzVKhWgHSCj4OB5wh4fXZw4KJHr+QWXHBRqhH DS8qsXyRv1kuec9IF4DXL87GNwZc6tg4JsqxiCVjvpMF83eRqxJB932rxuyzp6//OQNh 3CRg/qPnXrgO21Fi26mqt/NpPNwWqGy57PyA1nonfsD7OO/wxt6o+C61lQTOHZeIf76g 3VpA== X-Gm-Message-State: AElRT7H0p0+8JeZiPwps7WWhmcf2O+sE7dZbHTdLnNyDRa83fwNhZ4rQ GxzkoXyM22SesmoWGtfpSMfWPg== X-Google-Smtp-Source: AG47ELtzWk28gBGzmkAQG/ICVrgY6FP8pvPXuE22cDbmI7MfwJTyFLHOYm3a7gnQuvKEcx7TQ4O6Ng== X-Received: by 10.200.33.163 with SMTP id 32mr49517703qty.305.1520629517168; Fri, 09 Mar 2018 13:05:17 -0800 (PST) Received: from alvin.alvh.no-ip.org ([179.56.29.253]) by smtp.gmail.com with ESMTPSA id y20sm1147449qka.71.2018.03.09.13.05.16 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Fri, 09 Mar 2018 13:05:16 -0800 (PST) Received: by alvin.alvh.no-ip.org (Postfix, from userid 1000) id 9111E7A5; Fri, 9 Mar 2018 18:05:14 -0300 (-03) Date: Fri, 9 Mar 2018 18:05:14 -0300 From: Alvaro Herrera To: Thomas Munro Cc: Robert Haas , Peter Eisentraut , Pg Hackers , Simon Riggs Subject: Re: FOR EACH ROW triggers on partitioned tables Message-ID: <20180309210514.nrwmaxncndo4veuq@alvherre.pgsql> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="aby3nfmcj3viscaj" Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20180309204143.n4xwudjl5oawf55p@alvherre.pgsql> User-Agent: NeoMutt/20170306-137-4415bd-dirty (1.8.0) List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Precedence: bulk --aby3nfmcj3viscaj Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit ... and this little addendum makes pg_dump work correctly. -- Álvaro Herrera https://www.2ndQuadrant.com/ PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services --aby3nfmcj3viscaj Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="v7-addendum.patch" diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c index 867bbe8f1e..ca0a66753e 100644 --- a/src/backend/catalog/index.c +++ b/src/backend/catalog/index.c @@ -1363,7 +1363,7 @@ index_constraint_create(Relation heapRelation, (void) CreateTrigger(trigger, NULL, RelationGetRelid(heapRelation), InvalidOid, conOid, indexRelationId, InvalidOid, - InvalidOid, true); + InvalidOid, true, false); } /* diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index 4303c5a131..f5fc0938a6 100644 --- a/src/backend/commands/tablecmds.c +++ b/src/backend/commands/tablecmds.c @@ -8467,7 +8467,7 @@ CreateFKCheckTrigger(Oid myRelOid, Oid refRelOid, Constraint *fkconstraint, fk_trigger->args = NIL; (void) CreateTrigger(fk_trigger, NULL, myRelOid, refRelOid, constraintOid, - indexOid, InvalidOid, InvalidOid, true); + indexOid, InvalidOid, InvalidOid, true, false); /* Make changes-so-far visible */ CommandCounterIncrement(); @@ -8541,7 +8541,7 @@ createForeignKeyTriggers(Relation rel, Oid refRelOid, Constraint *fkconstraint, fk_trigger->args = NIL; (void) CreateTrigger(fk_trigger, NULL, refRelOid, myRelOid, constraintOid, - indexOid, InvalidOid, InvalidOid, true); + indexOid, InvalidOid, InvalidOid, true, false); /* Make changes-so-far visible */ CommandCounterIncrement(); @@ -8596,7 +8596,7 @@ createForeignKeyTriggers(Relation rel, Oid refRelOid, Constraint *fkconstraint, fk_trigger->args = NIL; (void) CreateTrigger(fk_trigger, NULL, refRelOid, myRelOid, constraintOid, - indexOid, InvalidOid, InvalidOid, true); + indexOid, InvalidOid, InvalidOid, true, false); /* Make changes-so-far visible */ CommandCounterIncrement(); @@ -14324,7 +14324,7 @@ CloneRowTriggersToPartition(Oid parentId, Oid partitionId) CreateTrigger(trigStmt, NULL, partitionId, InvalidOid, InvalidOid, InvalidOid, - trigForm->tgfoid, HeapTupleGetOid(tuple), false); + trigForm->tgfoid, HeapTupleGetOid(tuple), false, true); pfree(trigStmt); } diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c index c4f63c8b90..6a857df566 100644 --- a/src/backend/commands/trigger.c +++ b/src/backend/commands/trigger.c @@ -151,7 +151,8 @@ static bool before_stmt_triggers_fired(Oid relid, CmdType cmdType); ObjectAddress CreateTrigger(CreateTrigStmt *stmt, const char *queryString, Oid relOid, Oid refRelOid, Oid constraintOid, Oid indexOid, - Oid funcoid, Oid parentTriggerOid, bool isInternal) + Oid funcoid, Oid parentTriggerOid, bool isInternal, + bool in_partition) { int16 tgtype; int ncolumns; @@ -780,6 +781,11 @@ CreateTrigger(CreateTrigStmt *stmt, const char *queryString, /* * Build the new pg_trigger tuple. + * + * When we're creating a trigger in a partition, we mark it as internal, + * even though we don't do the isInternal magic in this function. This + * makes the triggers in partitions identical to the ones in the + * partitioned tables, except that they are marked internal. */ memset(nulls, false, sizeof(nulls)); @@ -789,7 +795,7 @@ CreateTrigger(CreateTrigStmt *stmt, const char *queryString, values[Anum_pg_trigger_tgfoid - 1] = ObjectIdGetDatum(funcoid); values[Anum_pg_trigger_tgtype - 1] = Int16GetDatum(tgtype); values[Anum_pg_trigger_tgenabled - 1] = CharGetDatum(TRIGGER_FIRES_ON_ORIGIN); - values[Anum_pg_trigger_tgisinternal - 1] = BoolGetDatum(isInternal); + values[Anum_pg_trigger_tgisinternal - 1] = BoolGetDatum(isInternal || in_partition); values[Anum_pg_trigger_tgconstrrelid - 1] = ObjectIdGetDatum(constrrelid); values[Anum_pg_trigger_tgconstrindid - 1] = ObjectIdGetDatum(indexOid); values[Anum_pg_trigger_tgconstraint - 1] = ObjectIdGetDatum(constraintOid); @@ -1089,7 +1095,7 @@ CreateTrigger(CreateTrigStmt *stmt, const char *queryString, CreateTrigger(copyObject(stmt), queryString, partdesc->oids[i], refRelOid, constraintOid, indexOnChild, - InvalidOid, trigoid, isInternal); + InvalidOid, trigoid, isInternal, true); } } diff --git a/src/backend/tcop/utility.c b/src/backend/tcop/utility.c index 9b197aecc5..6df4211280 100644 --- a/src/backend/tcop/utility.c +++ b/src/backend/tcop/utility.c @@ -1508,7 +1508,7 @@ ProcessUtilitySlow(ParseState *pstate, address = CreateTrigger((CreateTrigStmt *) parsetree, queryString, InvalidOid, InvalidOid, InvalidOid, InvalidOid, InvalidOid, - InvalidOid, false); + InvalidOid, false, false); break; case T_CreatePLangStmt: diff --git a/src/include/commands/trigger.h b/src/include/commands/trigger.h index 048bb8d988..fac450e967 100644 --- a/src/include/commands/trigger.h +++ b/src/include/commands/trigger.h @@ -159,7 +159,7 @@ extern PGDLLIMPORT int SessionReplicationRole; extern ObjectAddress CreateTrigger(CreateTrigStmt *stmt, const char *queryString, Oid relOid, Oid refRelOid, Oid constraintOid, Oid indexOid, - Oid funcid, Oid parentTriggerOid, bool isInternal); + Oid funcid, Oid parentTriggerOid, bool isInternal, bool recursing); extern void RemoveTriggerById(Oid trigOid); extern Oid get_trigger_oid(Oid relid, const char *name, bool missing_ok); --aby3nfmcj3viscaj--