Skip to content

Commit 8d8c2aa

Browse files
authored
Merge 'core/translate: Allow trigger names their own namespace' from Preston Thorpe
Closes #5867 Closes #6135
2 parents 6f43d20 + 7e5da9e commit 8d8c2aa

File tree

3 files changed

+91
-2
lines changed

3 files changed

+91
-2
lines changed

core/schema.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -728,7 +728,8 @@ impl Schema {
728728
}
729729

730730
pub fn add_trigger(&mut self, trigger: Trigger, table_name: &str) -> Result<()> {
731-
self.check_object_name_conflict(&trigger.name)?;
731+
// Triggers have their own namespace and duplicate trigger names
732+
// are checked in `translate_create_trigger`
732733
let table_name = normalize_ident(table_name);
733734

734735
// See [Schema::add_index] for why we push to the front of the deque.

core/translate/trigger.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,9 @@ pub fn translate_create_trigger(
187187
let escaped_trigger_name = escape_sql_string_literal(&normalized_trigger_name);
188188
program.emit_insn(Insn::ParseSchema {
189189
db: database_id,
190-
where_clause: Some(format!("name = '{escaped_trigger_name}'")),
190+
where_clause: Some(format!(
191+
"name = '{escaped_trigger_name}' AND type = 'trigger'"
192+
)),
191193
});
192194

193195
Ok(())
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
@database :memory:
2+
3+
setup schema {
4+
CREATE TABLE t(x);
5+
CREATE TABLE log(msg);
6+
}
7+
8+
@setup schema
9+
test trigger-same-name-as-table {
10+
CREATE TRIGGER t AFTER INSERT ON t BEGIN INSERT INTO log VALUES('fired'); END;
11+
INSERT INTO t VALUES(1);
12+
SELECT * FROM log;
13+
}
14+
expect {
15+
fired
16+
}
17+
18+
@setup schema
19+
test trigger-same-name-as-other-table {
20+
CREATE TABLE other(y);
21+
CREATE TRIGGER other AFTER INSERT ON t BEGIN INSERT INTO log VALUES('other_trigger'); END;
22+
INSERT INTO t VALUES(1);
23+
SELECT * FROM log;
24+
}
25+
expect {
26+
other_trigger
27+
}
28+
29+
@setup schema
30+
test trigger-same-name-as-index {
31+
CREATE INDEX idx ON t(x);
32+
CREATE TRIGGER idx AFTER INSERT ON t BEGIN INSERT INTO log VALUES('idx_trigger'); END;
33+
INSERT INTO t VALUES(1);
34+
SELECT * FROM log;
35+
}
36+
expect {
37+
idx_trigger
38+
}
39+
40+
@setup schema
41+
test trigger-if-not-exists-same-name-as-table {
42+
CREATE TRIGGER IF NOT EXISTS t AFTER INSERT ON t BEGIN INSERT INTO log VALUES('fired'); END;
43+
INSERT INTO t VALUES(1);
44+
SELECT * FROM log;
45+
}
46+
expect {
47+
fired
48+
}
49+
50+
@setup schema
51+
test trigger-same-name-as-view {
52+
CREATE VIEW v AS SELECT x FROM t;
53+
CREATE TRIGGER v AFTER INSERT ON t BEGIN INSERT INTO log VALUES('view_trigger'); END;
54+
INSERT INTO t VALUES(1);
55+
SELECT * FROM log;
56+
}
57+
expect {
58+
view_trigger
59+
}
60+
61+
@setup schema
62+
test drop-trigger-with-same-name-as-table {
63+
CREATE TRIGGER t AFTER INSERT ON t BEGIN INSERT INTO log VALUES('fired'); END;
64+
INSERT INTO t VALUES(1);
65+
DROP TRIGGER t;
66+
DELETE FROM log;
67+
INSERT INTO t VALUES(2);
68+
SELECT count(*) FROM log;
69+
}
70+
expect {
71+
0
72+
}
73+
74+
@setup schema
75+
test multiple-triggers-sharing-names-with-tables {
76+
CREATE TABLE a(v);
77+
CREATE TABLE b(v);
78+
CREATE TRIGGER a AFTER INSERT ON t BEGIN INSERT INTO log VALUES('trigger_a'); END;
79+
CREATE TRIGGER b AFTER INSERT ON t BEGIN INSERT INTO log VALUES('trigger_b'); END;
80+
INSERT INTO t VALUES(1);
81+
SELECT * FROM log;
82+
}
83+
expect unordered {
84+
trigger_a
85+
trigger_b
86+
}

0 commit comments

Comments
 (0)