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:
@ -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;
|
||||
|
Reference in New Issue
Block a user