Skip to content

Commit 648efd7

Browse files
authored
feat: adjust create and drop trigger for mysql dialect (#1734)
1 parent c335c88 commit 648efd7

File tree

4 files changed

+62
-8
lines changed

4 files changed

+62
-8
lines changed

src/ast/mod.rs

+5-2
Original file line numberDiff line numberDiff line change
@@ -3256,7 +3256,7 @@ pub enum Statement {
32563256
DropTrigger {
32573257
if_exists: bool,
32583258
trigger_name: ObjectName,
3259-
table_name: ObjectName,
3259+
table_name: Option<ObjectName>,
32603260
/// `CASCADE` or `RESTRICT`
32613261
option: Option<ReferentialAction>,
32623262
},
@@ -4062,7 +4062,10 @@ impl fmt::Display for Statement {
40624062
if *if_exists {
40634063
write!(f, " IF EXISTS")?;
40644064
}
4065-
write!(f, " {trigger_name} ON {table_name}")?;
4065+
match &table_name {
4066+
Some(table_name) => write!(f, " {trigger_name} ON {table_name}")?,
4067+
None => write!(f, " {trigger_name}")?,
4068+
};
40664069
if let Some(option) = option {
40674070
write!(f, " {option}")?;
40684071
}

src/parser/mod.rs

+7-4
Original file line numberDiff line numberDiff line change
@@ -4990,14 +4990,17 @@ impl<'a> Parser<'a> {
49904990
/// DROP TRIGGER [ IF EXISTS ] name ON table_name [ CASCADE | RESTRICT ]
49914991
/// ```
49924992
pub fn parse_drop_trigger(&mut self) -> Result<Statement, ParserError> {
4993-
if !dialect_of!(self is PostgreSqlDialect | GenericDialect) {
4993+
if !dialect_of!(self is PostgreSqlDialect | GenericDialect | MySqlDialect) {
49944994
self.prev_token();
49954995
return self.expected("an object type after DROP", self.peek_token());
49964996
}
49974997
let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
49984998
let trigger_name = self.parse_object_name(false)?;
4999-
self.expect_keyword_is(Keyword::ON)?;
5000-
let table_name = self.parse_object_name(false)?;
4999+
let table_name = if self.parse_keyword(Keyword::ON) {
5000+
Some(self.parse_object_name(false)?)
5001+
} else {
5002+
None
5003+
};
50015004
let option = self
50025005
.parse_one_of_keywords(&[Keyword::CASCADE, Keyword::RESTRICT])
50035006
.map(|keyword| match keyword {
@@ -5018,7 +5021,7 @@ impl<'a> Parser<'a> {
50185021
or_replace: bool,
50195022
is_constraint: bool,
50205023
) -> Result<Statement, ParserError> {
5021-
if !dialect_of!(self is PostgreSqlDialect | GenericDialect) {
5024+
if !dialect_of!(self is PostgreSqlDialect | GenericDialect | MySqlDialect) {
50225025
self.prev_token();
50235026
return self.expected("an object type after CREATE", self.peek_token());
50245027
}

tests/sqlparser_mysql.rs

+48
Original file line numberDiff line numberDiff line change
@@ -3291,3 +3291,51 @@ fn parse_looks_like_single_line_comment() {
32913291
"UPDATE account SET balance = balance WHERE account_id = 5752",
32923292
);
32933293
}
3294+
3295+
#[test]
3296+
fn parse_create_trigger() {
3297+
let sql_create_trigger = r#"
3298+
CREATE TRIGGER emp_stamp BEFORE INSERT ON emp
3299+
FOR EACH ROW EXECUTE FUNCTION emp_stamp();
3300+
"#;
3301+
let create_stmt = mysql().one_statement_parses_to(sql_create_trigger, "");
3302+
assert_eq!(
3303+
create_stmt,
3304+
Statement::CreateTrigger {
3305+
or_replace: false,
3306+
is_constraint: false,
3307+
name: ObjectName::from(vec![Ident::new("emp_stamp")]),
3308+
period: TriggerPeriod::Before,
3309+
events: vec![TriggerEvent::Insert],
3310+
table_name: ObjectName::from(vec![Ident::new("emp")]),
3311+
referenced_table_name: None,
3312+
referencing: vec![],
3313+
trigger_object: TriggerObject::Row,
3314+
include_each: true,
3315+
condition: None,
3316+
exec_body: TriggerExecBody {
3317+
exec_type: TriggerExecBodyType::Function,
3318+
func_desc: FunctionDesc {
3319+
name: ObjectName::from(vec![Ident::new("emp_stamp")]),
3320+
args: None,
3321+
}
3322+
},
3323+
characteristics: None,
3324+
}
3325+
);
3326+
}
3327+
3328+
#[test]
3329+
fn parse_drop_trigger() {
3330+
let sql_drop_trigger = "DROP TRIGGER emp_stamp;";
3331+
let drop_stmt = mysql().one_statement_parses_to(sql_drop_trigger, "");
3332+
assert_eq!(
3333+
drop_stmt,
3334+
Statement::DropTrigger {
3335+
if_exists: false,
3336+
trigger_name: ObjectName::from(vec![Ident::new("emp_stamp")]),
3337+
table_name: None,
3338+
option: None,
3339+
}
3340+
);
3341+
}

tests/sqlparser_postgres.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -5044,7 +5044,7 @@ fn parse_drop_trigger() {
50445044
Statement::DropTrigger {
50455045
if_exists,
50465046
trigger_name: ObjectName::from(vec![Ident::new("check_update")]),
5047-
table_name: ObjectName::from(vec![Ident::new("table_name")]),
5047+
table_name: Some(ObjectName::from(vec![Ident::new("table_name")])),
50485048
option
50495049
}
50505050
);
@@ -5297,7 +5297,7 @@ fn parse_trigger_related_functions() {
52975297
Statement::DropTrigger {
52985298
if_exists: false,
52995299
trigger_name: ObjectName::from(vec![Ident::new("emp_stamp")]),
5300-
table_name: ObjectName::from(vec![Ident::new("emp")]),
5300+
table_name: Some(ObjectName::from(vec![Ident::new("emp")])),
53015301
option: None
53025302
}
53035303
);

0 commit comments

Comments
 (0)