... and this little addendum makes pg_dump work correctly.

-- 
Álvaro Herrera                https://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
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);

Reply via email to