mod common;
use std::time::Duration;
use common::pgwire_harness::TestServer;
#[tokio::test(flavor = "multi_thread", worker_threads = 4)]
async fn different_trigger_bodies_execute_independently() {
let server = TestServer::start().await;
server
.exec(
"CREATE COLLECTION cache_a (\
id TEXT PRIMARY KEY, \
val TEXT DEFAULT 'none') WITH (engine='document_strict')",
)
.await
.unwrap();
server
.exec(
"CREATE COLLECTION cache_b (\
id TEXT PRIMARY KEY, \
val TEXT DEFAULT 'none') WITH (engine='document_strict')",
)
.await
.unwrap();
server.exec("CREATE COLLECTION trigger_log").await.unwrap();
server
.exec(
"CREATE TRIGGER trg_a AFTER INSERT ON cache_a FOR EACH ROW \
BEGIN \
INSERT INTO trigger_log { id: 'log_a', source: 'trigger_a_fired' }; \
END",
)
.await
.unwrap();
server
.exec(
"CREATE TRIGGER trg_b AFTER INSERT ON cache_b FOR EACH ROW \
BEGIN \
INSERT INTO trigger_log { id: 'log_b', source: 'trigger_b_fired' }; \
END",
)
.await
.unwrap();
server
.exec("INSERT INTO cache_a (id) VALUES ('a1')")
.await
.unwrap();
tokio::time::sleep(Duration::from_millis(500)).await;
server
.exec("INSERT INTO cache_b (id) VALUES ('b1')")
.await
.unwrap();
tokio::time::sleep(Duration::from_millis(500)).await;
let log_a = server
.query_text_joined("SELECT * FROM trigger_log WHERE id = 'log_a'")
.await
.unwrap();
assert_eq!(log_a.len(), 1, "trigger A should have logged: {log_a:?}");
assert!(
log_a[0].contains("trigger_a_fired"),
"trigger A should execute its own body, not B's: {:?}",
log_a[0]
);
assert!(
!log_a[0].contains("trigger_b_fired"),
"trigger A must not execute trigger B's body (cache collision): {:?}",
log_a[0]
);
let log_b = server
.query_text_joined("SELECT * FROM trigger_log WHERE id = 'log_b'")
.await
.unwrap();
assert_eq!(log_b.len(), 1, "trigger B should have logged: {log_b:?}");
assert!(
log_b[0].contains("trigger_b_fired"),
"trigger B should execute its own body: {:?}",
log_b[0]
);
}