1
0
mirror of https://github.com/postgres/postgres.git synced 2025-06-30 21:42:05 +03:00

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 86f575948c.

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
This commit is contained in:
Alvaro Herrera
2019-07-09 17:16:36 -04:00
parent e435c1e7d9
commit 2c84ea6cf9
4 changed files with 69 additions and 2 deletions

View File

@ -15915,6 +15915,7 @@ CloneRowTriggersToPartition(Relation parent, Relation partition)
Datum value;
bool isnull;
List *cols = NIL;
List *trigargs = NIL;
MemoryContext oldcxt;
/*
@ -15979,11 +15980,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;