| 2270 | } |
| 2271 | |
| 2272 | void |
| 2273 | ExecBSInsertTriggers(EState *estate, ResultRelInfo *relinfo) |
| 2274 | { |
| 2275 | TriggerDesc *trigdesc; |
| 2276 | int i; |
| 2277 | TriggerData LocTriggerData = {0}; |
| 2278 | |
| 2279 | trigdesc = relinfo->ri_TrigDesc; |
| 2280 | |
| 2281 | if (trigdesc == NULL) |
| 2282 | return; |
| 2283 | if (!trigdesc->trig_insert_before_statement) |
| 2284 | return; |
| 2285 | |
| 2286 | /* no-op if we already fired BS triggers in this context */ |
| 2287 | if (before_stmt_triggers_fired(RelationGetRelid(relinfo->ri_RelationDesc), |
| 2288 | CMD_INSERT)) |
| 2289 | return; |
| 2290 | |
| 2291 | LocTriggerData.type = T_TriggerData; |
| 2292 | LocTriggerData.tg_event = TRIGGER_EVENT_INSERT | |
| 2293 | TRIGGER_EVENT_BEFORE; |
| 2294 | LocTriggerData.tg_relation = relinfo->ri_RelationDesc; |
| 2295 | for (i = 0; i < trigdesc->numtriggers; i++) |
| 2296 | { |
| 2297 | Trigger *trigger = &trigdesc->triggers[i]; |
| 2298 | HeapTuple newtuple; |
| 2299 | |
| 2300 | if (!TRIGGER_TYPE_MATCHES(trigger->tgtype, |
| 2301 | TRIGGER_TYPE_STATEMENT, |
| 2302 | TRIGGER_TYPE_BEFORE, |
| 2303 | TRIGGER_TYPE_INSERT)) |
| 2304 | continue; |
| 2305 | if (!TriggerEnabled(estate, relinfo, trigger, LocTriggerData.tg_event, |
| 2306 | NULL, NULL, NULL)) |
| 2307 | continue; |
| 2308 | |
| 2309 | LocTriggerData.tg_trigger = trigger; |
| 2310 | newtuple = ExecCallTriggerFunc(&LocTriggerData, |
| 2311 | i, |
| 2312 | relinfo->ri_TrigFunctions, |
| 2313 | relinfo->ri_TrigInstrument, |
| 2314 | GetPerTupleMemoryContext(estate)); |
| 2315 | |
| 2316 | if (newtuple) |
| 2317 | ereport(ERROR, |
| 2318 | (errcode(ERRCODE_E_R_I_E_TRIGGER_PROTOCOL_VIOLATED), |
| 2319 | errmsg("BEFORE STATEMENT trigger cannot return a value"))); |
| 2320 | } |
| 2321 | } |
| 2322 | |
| 2323 | void |
| 2324 | ExecASInsertTriggers(EState *estate, ResultRelInfo *relinfo, |
no test coverage detected