| 2718 | } |
| 2719 | |
| 2720 | void |
| 2721 | ExecBSUpdateTriggers(EState *estate, ResultRelInfo *relinfo) |
| 2722 | { |
| 2723 | TriggerDesc *trigdesc; |
| 2724 | int i; |
| 2725 | TriggerData LocTriggerData = {0}; |
| 2726 | Bitmapset *updatedCols; |
| 2727 | |
| 2728 | trigdesc = relinfo->ri_TrigDesc; |
| 2729 | |
| 2730 | if (trigdesc == NULL) |
| 2731 | return; |
| 2732 | if (!trigdesc->trig_update_before_statement) |
| 2733 | return; |
| 2734 | |
| 2735 | /* no-op if we already fired BS triggers in this context */ |
| 2736 | if (before_stmt_triggers_fired(RelationGetRelid(relinfo->ri_RelationDesc), |
| 2737 | CMD_UPDATE)) |
| 2738 | return; |
| 2739 | |
| 2740 | /* statement-level triggers operate on the parent table */ |
| 2741 | Assert(relinfo->ri_RootResultRelInfo == NULL); |
| 2742 | |
| 2743 | updatedCols = ExecGetAllUpdatedCols(relinfo, estate); |
| 2744 | |
| 2745 | LocTriggerData.type = T_TriggerData; |
| 2746 | LocTriggerData.tg_event = TRIGGER_EVENT_UPDATE | |
| 2747 | TRIGGER_EVENT_BEFORE; |
| 2748 | LocTriggerData.tg_relation = relinfo->ri_RelationDesc; |
| 2749 | LocTriggerData.tg_updatedcols = updatedCols; |
| 2750 | for (i = 0; i < trigdesc->numtriggers; i++) |
| 2751 | { |
| 2752 | Trigger *trigger = &trigdesc->triggers[i]; |
| 2753 | HeapTuple newtuple; |
| 2754 | |
| 2755 | if (!TRIGGER_TYPE_MATCHES(trigger->tgtype, |
| 2756 | TRIGGER_TYPE_STATEMENT, |
| 2757 | TRIGGER_TYPE_BEFORE, |
| 2758 | TRIGGER_TYPE_UPDATE)) |
| 2759 | continue; |
| 2760 | if (!TriggerEnabled(estate, relinfo, trigger, LocTriggerData.tg_event, |
| 2761 | updatedCols, NULL, NULL)) |
| 2762 | continue; |
| 2763 | |
| 2764 | LocTriggerData.tg_trigger = trigger; |
| 2765 | newtuple = ExecCallTriggerFunc(&LocTriggerData, |
| 2766 | i, |
| 2767 | relinfo->ri_TrigFunctions, |
| 2768 | relinfo->ri_TrigInstrument, |
| 2769 | GetPerTupleMemoryContext(estate)); |
| 2770 | |
| 2771 | if (newtuple) |
| 2772 | ereport(ERROR, |
| 2773 | (errcode(ERRCODE_E_R_I_E_TRIGGER_PROTOCOL_VIOLATED), |
| 2774 | errmsg("BEFORE STATEMENT trigger cannot return a value"))); |
| 2775 | } |
| 2776 | } |
| 2777 |
no test coverage detected