mirror of
https://github.com/postgres/postgres.git
synced 2025-06-30 21:42:05 +03:00
Preserve firing-on state when cloning row triggers to partitions
When triggers are cloned from partitioned tables to their partitions,
the 'tgenabled' flag (origin/replica/always/disable) was not propagated.
Make it so that the flag on the trigger on partition is initially set to
the same value as on the partitioned table.
Add a test case to verify the behavior.
Backpatch to 11, where this appeared in commit 86f575948c
.
Author: Álvaro Herrera <alvherre@alvh.no-ip.org>
Reported-by: Justin Pryzby <pryzby@telsasoft.com>
Discussion: https://postgr.es/m/20200930223450.GA14848@telsasoft.com
This commit is contained in:
@ -151,6 +151,24 @@ CreateTrigger(CreateTrigStmt *stmt, const char *queryString,
|
||||
Oid relOid, Oid refRelOid, Oid constraintOid, Oid indexOid,
|
||||
Oid funcoid, Oid parentTriggerOid, Node *whenClause,
|
||||
bool isInternal, bool in_partition)
|
||||
{
|
||||
return
|
||||
CreateTriggerFiringOn(stmt, queryString, relOid, refRelOid,
|
||||
constraintOid, indexOid, funcoid,
|
||||
parentTriggerOid, whenClause, isInternal,
|
||||
in_partition, TRIGGER_FIRES_ON_ORIGIN);
|
||||
}
|
||||
|
||||
/*
|
||||
* Like the above; additionally the firing condition
|
||||
* (always/origin/replica/disabled) can be specified.
|
||||
*/
|
||||
ObjectAddress
|
||||
CreateTriggerFiringOn(CreateTrigStmt *stmt, const char *queryString,
|
||||
Oid relOid, Oid refRelOid, Oid constraintOid,
|
||||
Oid indexOid, Oid funcoid, Oid parentTriggerOid,
|
||||
Node *whenClause, bool isInternal, bool in_partition,
|
||||
char trigger_fires_when)
|
||||
{
|
||||
int16 tgtype;
|
||||
int ncolumns;
|
||||
@ -848,7 +866,7 @@ CreateTrigger(CreateTrigStmt *stmt, const char *queryString,
|
||||
CStringGetDatum(trigname));
|
||||
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_tgenabled - 1] = trigger_fires_when;
|
||||
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);
|
||||
@ -1195,11 +1213,11 @@ CreateTrigger(CreateTrigStmt *stmt, const char *queryString,
|
||||
map_partition_varattnos((List *) qual, PRS2_NEW_VARNO,
|
||||
childTbl, rel);
|
||||
|
||||
CreateTrigger(childStmt, queryString,
|
||||
partdesc->oids[i], refRelOid,
|
||||
InvalidOid, indexOnChild,
|
||||
funcoid, trigoid, qual,
|
||||
isInternal, true);
|
||||
CreateTriggerFiringOn(childStmt, queryString,
|
||||
partdesc->oids[i], refRelOid,
|
||||
InvalidOid, indexOnChild,
|
||||
funcoid, trigoid, qual,
|
||||
isInternal, true, trigger_fires_when);
|
||||
|
||||
table_close(childTbl, NoLock);
|
||||
|
||||
|
Reference in New Issue
Block a user