()
| 328 | |
| 329 | #[test] |
| 330 | fn statement_and_row_triggers_coexist() { |
| 331 | let reg = TriggerRegistry::new(); |
| 332 | // Row-level AFTER trigger. |
| 333 | reg.register(make_trigger_full( |
| 334 | "audit_row", |
| 335 | "orders", |
| 336 | TriggerTiming::After, |
| 337 | true, |
| 338 | false, |
| 339 | false, |
| 340 | TriggerExecutionMode::Async, |
| 341 | TriggerGranularity::Row, |
| 342 | TriggerSecurity::Invoker, |
| 343 | )); |
| 344 | // Statement-level AFTER trigger. |
| 345 | reg.register(make_statement_trigger( |
| 346 | "refresh_mv", |
| 347 | "orders", |
| 348 | DmlEvent::Insert, |
| 349 | TriggerExecutionMode::Async, |
| 350 | )); |
| 351 | |
| 352 | let matched = reg.get_matching(1, "orders", DmlEvent::Insert); |
| 353 | assert_eq!(matched.len(), 2); |
| 354 | // Both returned — caller filters by granularity. |
| 355 | } |
| 356 | |
| 357 | // --------------------------------------------------------------------------- |
| 358 | // SECURITY DEFINER trigger storage |
nothing calls this directly
no test coverage detected