aboutsummaryrefslogtreecommitdiff
path: root/src/backend
diff options
context:
space:
mode:
authorAlvaro Herrera <alvherre@alvh.no-ip.org>2019-07-09 17:16:36 -0400
committerAlvaro Herrera <alvherre@alvh.no-ip.org>2019-07-09 17:16:36 -0400
commit1637d959d618886ac6ca59cc3c3785ce5ba06b40 (patch)
tree415c68ab722a7cd7933b6d744e4b13710813092b /src/backend
parent3955c50f3762be6f0a63573c5b4efef72b30dc2b (diff)
downloadpostgresql-1637d959d618886ac6ca59cc3c3785ce5ba06b40.tar.gz
postgresql-1637d959d618886ac6ca59cc3c3785ce5ba06b40.zip
Propagate trigger arguments to partitions
We were creating the cloned triggers with an empty list of arguments, losing the ones that had been specified by the user when creating the trigger in the partitioned table. Repair. This was forgotten in commit 86f575948c77. Author: Patrick McHardy Reviewed-by: Tomas Vondra Discussion: https://postgr.es/m/20190709130027.amr2cavjvo7rdvac@access1.trash.net Discussion: https://postgr.es/m/15752-123bc90287986de4@postgresql.org
Diffstat (limited to 'src/backend')
-rw-r--r--src/backend/commands/tablecmds.c23
-rw-r--r--src/backend/commands/trigger.c1
2 files changed, 22 insertions, 2 deletions
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index c62922a1124..5fbe7242c42 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -15202,6 +15202,7 @@ CloneRowTriggersToPartition(Relation parent, Relation partition)
Datum value;
bool isnull;
List *cols = NIL;
+ List *trigargs = NIL;
MemoryContext oldcxt;
/*
@@ -15266,11 +15267,31 @@ CloneRowTriggersToPartition(Relation parent, Relation partition)
}
}
+ /* Reconstruct trigger arguments list. */
+ if (trigForm->tgnargs > 0)
+ {
+ char *p;
+
+ value = heap_getattr(tuple, Anum_pg_trigger_tgargs,
+ RelationGetDescr(pg_trigger), &isnull);
+ if (isnull)
+ elog(ERROR, "tgargs is null for trigger \"%s\" in partition \"%s\"",
+ NameStr(trigForm->tgname), RelationGetRelationName(partition));
+
+ p = (char *) VARDATA_ANY(DatumGetByteaPP(value));
+
+ for (int i = 0; i < trigForm->tgnargs; i++)
+ {
+ trigargs = lappend(trigargs, makeString(pstrdup(p)));
+ p += strlen(p) + 1;
+ }
+ }
+
trigStmt = makeNode(CreateTrigStmt);
trigStmt->trigname = NameStr(trigForm->tgname);
trigStmt->relation = NULL;
trigStmt->funcname = NULL; /* passed separately */
- trigStmt->args = NULL; /* passed separately */
+ trigStmt->args = trigargs;
trigStmt->row = true;
trigStmt->timing = trigForm->tgtype & TRIGGER_TYPE_TIMING_MASK;
trigStmt->events = trigForm->tgtype & TRIGGER_TYPE_EVENT_MASK;
diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c
index f6c7a3fefc5..a716827c77a 100644
--- a/src/backend/commands/trigger.c
+++ b/src/backend/commands/trigger.c
@@ -1153,7 +1153,6 @@ CreateTrigger(CreateTrigStmt *stmt, const char *queryString,
*/
childStmt = (CreateTrigStmt *) copyObject(stmt);
childStmt->funcname = NIL;
- childStmt->args = NIL;
childStmt->whenClause = NULL;
/* If there is a WHEN clause, create a modified copy of it */