mirror of
https://github.com/apache/datafusion-sqlparser-rs.git
synced 2025-08-04 14:28:22 +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 {
|
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}")?;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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());
|
||||||
}
|
}
|
||||||
|
|
|
@ -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,
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue