feat: adjust create and drop trigger for mysql dialect (#1734)

This commit is contained in:
Michael 2025-02-25 08:50:29 +02:00 committed by GitHub
parent c335c8883b
commit 648efd7057
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 62 additions and 8 deletions

View file

@ -3256,7 +3256,7 @@ pub enum Statement {
DropTrigger { DropTrigger {
if_exists: bool, if_exists: bool,
trigger_name: ObjectName, trigger_name: ObjectName,
table_name: ObjectName, table_name: Option<ObjectName>,
/// `CASCADE` or `RESTRICT` /// `CASCADE` or `RESTRICT`
option: Option<ReferentialAction>, option: Option<ReferentialAction>,
}, },
@ -4062,7 +4062,10 @@ impl fmt::Display for Statement {
if *if_exists { if *if_exists {
write!(f, " IF EXISTS")?; write!(f, " IF EXISTS")?;
} }
write!(f, " {trigger_name} ON {table_name}")?; match &table_name {
Some(table_name) => write!(f, " {trigger_name} ON {table_name}")?,
None => write!(f, " {trigger_name}")?,
};
if let Some(option) = option { if let Some(option) = option {
write!(f, " {option}")?; write!(f, " {option}")?;
} }

View file

@ -4990,14 +4990,17 @@ impl<'a> Parser<'a> {
/// DROP TRIGGER [ IF EXISTS ] name ON table_name [ CASCADE | RESTRICT ] /// DROP TRIGGER [ IF EXISTS ] name ON table_name [ CASCADE | RESTRICT ]
/// ``` /// ```
pub fn parse_drop_trigger(&mut self) -> Result<Statement, ParserError> { pub fn parse_drop_trigger(&mut self) -> Result<Statement, ParserError> {
if !dialect_of!(self is PostgreSqlDialect | GenericDialect) { if !dialect_of!(self is PostgreSqlDialect | GenericDialect | MySqlDialect) {
self.prev_token(); self.prev_token();
return self.expected("an object type after DROP", self.peek_token()); return self.expected("an object type after DROP", self.peek_token());
} }
let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]); let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
let trigger_name = self.parse_object_name(false)?; let trigger_name = self.parse_object_name(false)?;
self.expect_keyword_is(Keyword::ON)?; let table_name = if self.parse_keyword(Keyword::ON) {
let table_name = self.parse_object_name(false)?; Some(self.parse_object_name(false)?)
} else {
None
};
let option = self let option = self
.parse_one_of_keywords(&[Keyword::CASCADE, Keyword::RESTRICT]) .parse_one_of_keywords(&[Keyword::CASCADE, Keyword::RESTRICT])
.map(|keyword| match keyword { .map(|keyword| match keyword {
@ -5018,7 +5021,7 @@ impl<'a> Parser<'a> {
or_replace: bool, or_replace: bool,
is_constraint: bool, is_constraint: bool,
) -> Result<Statement, ParserError> { ) -> Result<Statement, ParserError> {
if !dialect_of!(self is PostgreSqlDialect | GenericDialect) { if !dialect_of!(self is PostgreSqlDialect | GenericDialect | MySqlDialect) {
self.prev_token(); self.prev_token();
return self.expected("an object type after CREATE", self.peek_token()); return self.expected("an object type after CREATE", self.peek_token());
} }

View file

@ -3291,3 +3291,51 @@ fn parse_looks_like_single_line_comment() {
"UPDATE account SET balance = balance WHERE account_id = 5752", "UPDATE account SET balance = balance WHERE account_id = 5752",
); );
} }
#[test]
fn parse_create_trigger() {
let sql_create_trigger = r#"
CREATE TRIGGER emp_stamp BEFORE INSERT ON emp
FOR EACH ROW EXECUTE FUNCTION emp_stamp();
"#;
let create_stmt = mysql().one_statement_parses_to(sql_create_trigger, "");
assert_eq!(
create_stmt,
Statement::CreateTrigger {
or_replace: false,
is_constraint: false,
name: ObjectName::from(vec![Ident::new("emp_stamp")]),
period: TriggerPeriod::Before,
events: vec![TriggerEvent::Insert],
table_name: ObjectName::from(vec![Ident::new("emp")]),
referenced_table_name: None,
referencing: vec![],
trigger_object: TriggerObject::Row,
include_each: true,
condition: None,
exec_body: TriggerExecBody {
exec_type: TriggerExecBodyType::Function,
func_desc: FunctionDesc {
name: ObjectName::from(vec![Ident::new("emp_stamp")]),
args: None,
}
},
characteristics: None,
}
);
}
#[test]
fn parse_drop_trigger() {
let sql_drop_trigger = "DROP TRIGGER emp_stamp;";
let drop_stmt = mysql().one_statement_parses_to(sql_drop_trigger, "");
assert_eq!(
drop_stmt,
Statement::DropTrigger {
if_exists: false,
trigger_name: ObjectName::from(vec![Ident::new("emp_stamp")]),
table_name: None,
option: None,
}
);
}

View file

@ -5044,7 +5044,7 @@ fn parse_drop_trigger() {
Statement::DropTrigger { Statement::DropTrigger {
if_exists, if_exists,
trigger_name: ObjectName::from(vec![Ident::new("check_update")]), trigger_name: ObjectName::from(vec![Ident::new("check_update")]),
table_name: ObjectName::from(vec![Ident::new("table_name")]), table_name: Some(ObjectName::from(vec![Ident::new("table_name")])),
option option
} }
); );
@ -5297,7 +5297,7 @@ fn parse_trigger_related_functions() {
Statement::DropTrigger { Statement::DropTrigger {
if_exists: false, if_exists: false,
trigger_name: ObjectName::from(vec![Ident::new("emp_stamp")]), trigger_name: ObjectName::from(vec![Ident::new("emp_stamp")]),
table_name: ObjectName::from(vec![Ident::new("emp")]), table_name: Some(ObjectName::from(vec![Ident::new("emp")])),
option: None option: None
} }
); );