| 2967 | } |
| 2968 | |
| 2969 | bool |
| 2970 | ExecIRUpdateTriggers(EState *estate, ResultRelInfo *relinfo, |
| 2971 | HeapTuple trigtuple, TupleTableSlot *newslot) |
| 2972 | { |
| 2973 | TriggerDesc *trigdesc = relinfo->ri_TrigDesc; |
| 2974 | TupleTableSlot *oldslot = ExecGetTriggerOldSlot(estate, relinfo); |
| 2975 | HeapTuple newtuple = NULL; |
| 2976 | bool should_free; |
| 2977 | TriggerData LocTriggerData = {0}; |
| 2978 | int i; |
| 2979 | |
| 2980 | LocTriggerData.type = T_TriggerData; |
| 2981 | LocTriggerData.tg_event = TRIGGER_EVENT_UPDATE | |
| 2982 | TRIGGER_EVENT_ROW | |
| 2983 | TRIGGER_EVENT_INSTEAD; |
| 2984 | LocTriggerData.tg_relation = relinfo->ri_RelationDesc; |
| 2985 | |
| 2986 | ExecForceStoreHeapTuple(trigtuple, oldslot, false); |
| 2987 | |
| 2988 | for (i = 0; i < trigdesc->numtriggers; i++) |
| 2989 | { |
| 2990 | Trigger *trigger = &trigdesc->triggers[i]; |
| 2991 | HeapTuple oldtuple; |
| 2992 | |
| 2993 | if (!TRIGGER_TYPE_MATCHES(trigger->tgtype, |
| 2994 | TRIGGER_TYPE_ROW, |
| 2995 | TRIGGER_TYPE_INSTEAD, |
| 2996 | TRIGGER_TYPE_UPDATE)) |
| 2997 | continue; |
| 2998 | if (!TriggerEnabled(estate, relinfo, trigger, LocTriggerData.tg_event, |
| 2999 | NULL, oldslot, newslot)) |
| 3000 | continue; |
| 3001 | |
| 3002 | if (!newtuple) |
| 3003 | newtuple = ExecFetchSlotHeapTuple(newslot, true, &should_free); |
| 3004 | |
| 3005 | LocTriggerData.tg_trigslot = oldslot; |
| 3006 | LocTriggerData.tg_trigtuple = trigtuple; |
| 3007 | LocTriggerData.tg_newslot = newslot; |
| 3008 | LocTriggerData.tg_newtuple = oldtuple = newtuple; |
| 3009 | |
| 3010 | LocTriggerData.tg_trigger = trigger; |
| 3011 | newtuple = ExecCallTriggerFunc(&LocTriggerData, |
| 3012 | i, |
| 3013 | relinfo->ri_TrigFunctions, |
| 3014 | relinfo->ri_TrigInstrument, |
| 3015 | GetPerTupleMemoryContext(estate)); |
| 3016 | if (newtuple == NULL) |
| 3017 | { |
| 3018 | return false; /* "do nothing" */ |
| 3019 | } |
| 3020 | else if (newtuple != oldtuple) |
| 3021 | { |
| 3022 | ExecForceStoreHeapTuple(newtuple, newslot, false); |
| 3023 | |
| 3024 | if (should_free) |
| 3025 | heap_freetuple(oldtuple); |
| 3026 |
no test coverage detected