Adds support for mysql's drop index (#1864)

Co-authored-by: Ifeanyi Ubah <ify1992@yahoo.com>
This commit is contained in:
Dmitriy Mazurin 2025-05-30 08:16:36 +01:00 committed by GitHub
parent a8bde39efb
commit 80d47eee84
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 58 additions and 11 deletions

View file

@ -3405,6 +3405,9 @@ pub enum Statement {
purge: bool,
/// MySQL-specific "TEMPORARY" keyword
temporary: bool,
/// MySQL-specific drop index syntax, which requires table specification
/// See <https://dev.mysql.com/doc/refman/8.4/en/drop-index.html>
table: Option<ObjectName>,
},
/// ```sql
/// DROP FUNCTION
@ -5242,7 +5245,9 @@ impl fmt::Display for Statement {
restrict,
purge,
temporary,
} => write!(
table,
} => {
write!(
f,
"DROP {}{}{} {}{}{}{}",
if *temporary { "TEMPORARY " } else { "" },
@ -5251,8 +5256,13 @@ impl fmt::Display for Statement {
display_comma_separated(names),
if *cascade { " CASCADE" } else { "" },
if *restrict { " RESTRICT" } else { "" },
if *purge { " PURGE" } else { "" }
),
if *purge { " PURGE" } else { "" },
)?;
if let Some(table_name) = table.as_ref() {
write!(f, " ON {}", table_name)?;
};
Ok(())
}
Statement::DropFunction {
if_exists,
func_desc,

View file

@ -6255,6 +6255,11 @@ impl<'a> Parser<'a> {
loc
);
}
let table = if self.parse_keyword(Keyword::ON) {
Some(self.parse_object_name(false)?)
} else {
None
};
Ok(Statement::Drop {
object_type,
if_exists,
@ -6263,6 +6268,7 @@ impl<'a> Parser<'a> {
restrict,
purge,
temporary,
table,
})
}

View file

@ -3987,3 +3987,34 @@ fn parse_straight_join() {
mysql()
.verified_stmt("SELECT a.*, b.* FROM table_a STRAIGHT_JOIN table_b AS b ON a.b_id = b.id");
}
#[test]
fn parse_drop_index() {
let sql = "DROP INDEX idx_name ON table_name";
match mysql().verified_stmt(sql) {
Statement::Drop {
object_type,
if_exists,
names,
cascade,
restrict,
purge,
temporary,
table,
} => {
assert!(!if_exists);
assert_eq!(ObjectType::Index, object_type);
assert_eq!(
vec!["idx_name"],
names.iter().map(ToString::to_string).collect::<Vec<_>>()
);
assert!(!cascade);
assert!(!restrict);
assert!(!purge);
assert!(!temporary);
assert!(table.is_some());
assert_eq!("table_name", table.unwrap().to_string());
}
_ => unreachable!(),
}
}