mirror of
https://github.com/postgres/postgres.git
synced 2025-06-30 21:42:05 +03:00
Fix ALTER TABLE .. ENABLE/DISABLE TRIGGER recursion
More precisely, correctly handle the ONLY flag indicating not to
recurse. This was implemented in 86f575948c
by recursing in
trigger.c, but that's the wrong place; use ATSimpleRecursion instead,
which behaves properly. However, because legacy inheritance has never
recursed in that situation, make sure to do that only for new-style
partitioning.
I noticed this problem while testing a fix for another bug in the
vicinity.
This has been wrong all along, so backpatch to 11.
Discussion: https://postgr.es/m/20201016235925.GA29829@alvherre.pgsql
This commit is contained in:
@ -1531,27 +1531,6 @@ EnableDisableTrigger(Relation rel, const char *tgname,
|
||||
|
||||
heap_freetuple(newtup);
|
||||
|
||||
/*
|
||||
* When altering FOR EACH ROW triggers on a partitioned table, do
|
||||
* the same on the partitions as well.
|
||||
*/
|
||||
if (rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE &&
|
||||
(TRIGGER_FOR_ROW(oldtrig->tgtype)))
|
||||
{
|
||||
PartitionDesc partdesc = RelationGetPartitionDesc(rel);
|
||||
int i;
|
||||
|
||||
for (i = 0; i < partdesc->nparts; i++)
|
||||
{
|
||||
Relation part;
|
||||
|
||||
part = relation_open(partdesc->oids[i], lockmode);
|
||||
EnableDisableTrigger(part, NameStr(oldtrig->tgname),
|
||||
fires_when, skip_system, lockmode);
|
||||
table_close(part, NoLock); /* keep lock till commit */
|
||||
}
|
||||
}
|
||||
|
||||
changed = true;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user