mirror of
https://github.com/apache/datafusion-sqlparser-rs.git
synced 2025-08-04 06:18:17 +00:00
feat: adjust create and drop trigger for mysql dialect (#1734)
This commit is contained in:
parent
c335c8883b
commit
648efd7057
4 changed files with 62 additions and 8 deletions
|
@ -3256,7 +3256,7 @@ pub enum Statement {
|
|||
DropTrigger {
|
||||
if_exists: bool,
|
||||
trigger_name: ObjectName,
|
||||
table_name: ObjectName,
|
||||
table_name: Option<ObjectName>,
|
||||
/// `CASCADE` or `RESTRICT`
|
||||
option: Option<ReferentialAction>,
|
||||
},
|
||||
|
@ -4062,7 +4062,10 @@ impl fmt::Display for Statement {
|
|||
if *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 {
|
||||
write!(f, " {option}")?;
|
||||
}
|
||||
|
|
|
@ -4990,14 +4990,17 @@ impl<'a> Parser<'a> {
|
|||
/// DROP TRIGGER [ IF EXISTS ] name ON table_name [ CASCADE | RESTRICT ]
|
||||
/// ```
|
||||
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();
|
||||
return self.expected("an object type after DROP", self.peek_token());
|
||||
}
|
||||
let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
|
||||
let trigger_name = self.parse_object_name(false)?;
|
||||
self.expect_keyword_is(Keyword::ON)?;
|
||||
let table_name = self.parse_object_name(false)?;
|
||||
let table_name = if self.parse_keyword(Keyword::ON) {
|
||||
Some(self.parse_object_name(false)?)
|
||||
} else {
|
||||
None
|
||||
};
|
||||
let option = self
|
||||
.parse_one_of_keywords(&[Keyword::CASCADE, Keyword::RESTRICT])
|
||||
.map(|keyword| match keyword {
|
||||
|
@ -5018,7 +5021,7 @@ impl<'a> Parser<'a> {
|
|||
or_replace: bool,
|
||||
is_constraint: bool,
|
||||
) -> Result<Statement, ParserError> {
|
||||
if !dialect_of!(self is PostgreSqlDialect | GenericDialect) {
|
||||
if !dialect_of!(self is PostgreSqlDialect | GenericDialect | MySqlDialect) {
|
||||
self.prev_token();
|
||||
return self.expected("an object type after CREATE", self.peek_token());
|
||||
}
|
||||
|
|
|
@ -3291,3 +3291,51 @@ fn parse_looks_like_single_line_comment() {
|
|||
"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,
|
||||
}
|
||||
);
|
||||
}
|
||||
|
|
|
@ -5044,7 +5044,7 @@ fn parse_drop_trigger() {
|
|||
Statement::DropTrigger {
|
||||
if_exists,
|
||||
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
|
||||
}
|
||||
);
|
||||
|
@ -5297,7 +5297,7 @@ fn parse_trigger_related_functions() {
|
|||
Statement::DropTrigger {
|
||||
if_exists: false,
|
||||
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
|
||||
}
|
||||
);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue