diff --git a/src/ast/mod.rs b/src/ast/mod.rs index d08ef0e2b..ad8c76298 100644 --- a/src/ast/mod.rs +++ b/src/ast/mod.rs @@ -1401,6 +1401,8 @@ pub enum Statement { /// Hive allows you specify whether the table's stored data will be /// deleted along with the dropped table purge: bool, + /// MySQL-specific "TEMPORARY" keyword + temporary: bool, }, /// DROP Function DropFunction { @@ -2572,9 +2574,11 @@ impl fmt::Display for Statement { cascade, restrict, purge, + temporary, } => write!( f, - "DROP {}{} {}{}{}{}", + "DROP {}{}{} {}{}{}{}", + if *temporary { "TEMPORARY " } else { "" }, object_type, if *if_exists { " IF EXISTS" } else { "" }, display_comma_separated(names), diff --git a/src/parser.rs b/src/parser.rs index 7dd07d050..91e21ec38 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -3127,6 +3127,10 @@ impl<'a> Parser<'a> { } pub fn parse_drop(&mut self) -> Result { + // MySQL dialect supports `TEMPORARY` + let temporary = dialect_of!(self is MySqlDialect | GenericDialect) + && self.parse_keyword(Keyword::TEMPORARY); + let object_type = if self.parse_keyword(Keyword::TABLE) { ObjectType::Table } else if self.parse_keyword(Keyword::VIEW) { @@ -3169,6 +3173,7 @@ impl<'a> Parser<'a> { cascade, restrict, purge, + temporary, }) } diff --git a/tests/sqlparser_common.rs b/tests/sqlparser_common.rs index 444e6d346..9ec182f21 100644 --- a/tests/sqlparser_common.rs +++ b/tests/sqlparser_common.rs @@ -5432,6 +5432,7 @@ fn parse_drop_table() { names, cascade, purge: _, + temporary, .. } => { assert!(!if_exists); @@ -5441,6 +5442,7 @@ fn parse_drop_table() { names.iter().map(ToString::to_string).collect::>() ); assert!(!cascade); + assert!(!temporary); } _ => unreachable!(), } @@ -5453,6 +5455,7 @@ fn parse_drop_table() { names, cascade, purge: _, + temporary, .. } => { assert!(if_exists); @@ -5462,6 +5465,7 @@ fn parse_drop_table() { names.iter().map(ToString::to_string).collect::>() ); assert!(cascade); + assert!(!temporary); } _ => unreachable!(), } diff --git a/tests/sqlparser_mysql.rs b/tests/sqlparser_mysql.rs index ae95de2ea..07337ec70 100644 --- a/tests/sqlparser_mysql.rs +++ b/tests/sqlparser_mysql.rs @@ -1597,3 +1597,29 @@ fn parse_string_introducers() { fn parse_div_infix() { mysql().verified_stmt(r#"SELECT 5 DIV 2"#); } + +#[test] +fn parse_drop_temporary_table() { + let sql = "DROP TEMPORARY TABLE foo"; + match mysql().verified_stmt(sql) { + Statement::Drop { + object_type, + if_exists, + names, + cascade, + purge: _, + temporary, + .. + } => { + assert!(!if_exists); + assert_eq!(ObjectType::Table, object_type); + assert_eq!( + vec!["foo"], + names.iter().map(ToString::to_string).collect::>() + ); + assert!(!cascade); + assert!(temporary); + } + _ => unreachable!(), + } +}