Support DROP TEMPORARY TABLE, MySQL syntax (#916)

This commit is contained in:
liadgiladi 2023-08-07 17:54:24 +03:00 committed by GitHub
parent 10a6ec5637
commit eb4be98980
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 40 additions and 1 deletions

View file

@ -1401,6 +1401,8 @@ pub enum Statement {
/// Hive allows you specify whether the table's stored data will be /// Hive allows you specify whether the table's stored data will be
/// deleted along with the dropped table /// deleted along with the dropped table
purge: bool, purge: bool,
/// MySQL-specific "TEMPORARY" keyword
temporary: bool,
}, },
/// DROP Function /// DROP Function
DropFunction { DropFunction {
@ -2572,9 +2574,11 @@ impl fmt::Display for Statement {
cascade, cascade,
restrict, restrict,
purge, purge,
temporary,
} => write!( } => write!(
f, f,
"DROP {}{} {}{}{}{}", "DROP {}{}{} {}{}{}{}",
if *temporary { "TEMPORARY " } else { "" },
object_type, object_type,
if *if_exists { " IF EXISTS" } else { "" }, if *if_exists { " IF EXISTS" } else { "" },
display_comma_separated(names), display_comma_separated(names),

View file

@ -3127,6 +3127,10 @@ impl<'a> Parser<'a> {
} }
pub fn parse_drop(&mut self) -> Result<Statement, ParserError> { pub fn parse_drop(&mut self) -> Result<Statement, ParserError> {
// 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) { let object_type = if self.parse_keyword(Keyword::TABLE) {
ObjectType::Table ObjectType::Table
} else if self.parse_keyword(Keyword::VIEW) { } else if self.parse_keyword(Keyword::VIEW) {
@ -3169,6 +3173,7 @@ impl<'a> Parser<'a> {
cascade, cascade,
restrict, restrict,
purge, purge,
temporary,
}) })
} }

View file

@ -5432,6 +5432,7 @@ fn parse_drop_table() {
names, names,
cascade, cascade,
purge: _, purge: _,
temporary,
.. ..
} => { } => {
assert!(!if_exists); assert!(!if_exists);
@ -5441,6 +5442,7 @@ fn parse_drop_table() {
names.iter().map(ToString::to_string).collect::<Vec<_>>() names.iter().map(ToString::to_string).collect::<Vec<_>>()
); );
assert!(!cascade); assert!(!cascade);
assert!(!temporary);
} }
_ => unreachable!(), _ => unreachable!(),
} }
@ -5453,6 +5455,7 @@ fn parse_drop_table() {
names, names,
cascade, cascade,
purge: _, purge: _,
temporary,
.. ..
} => { } => {
assert!(if_exists); assert!(if_exists);
@ -5462,6 +5465,7 @@ fn parse_drop_table() {
names.iter().map(ToString::to_string).collect::<Vec<_>>() names.iter().map(ToString::to_string).collect::<Vec<_>>()
); );
assert!(cascade); assert!(cascade);
assert!(!temporary);
} }
_ => unreachable!(), _ => unreachable!(),
} }

View file

@ -1597,3 +1597,29 @@ fn parse_string_introducers() {
fn parse_div_infix() { fn parse_div_infix() {
mysql().verified_stmt(r#"SELECT 5 DIV 2"#); 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::<Vec<_>>()
);
assert!(!cascade);
assert!(temporary);
}
_ => unreachable!(),
}
}