From e3f15071f86ed6b021dcbc954a192c1ecb78b216 Mon Sep 17 00:00:00 2001 From: Dmitriy Mazurin Date: Tue, 27 May 2025 18:23:58 +0100 Subject: [PATCH 1/2] Adds support for mysql's drop index --- src/ast/mod.rs | 32 +++++++++++++++++++++----------- src/parser/mod.rs | 6 ++++++ tests/sqlparser_mysql.rs | 31 +++++++++++++++++++++++++++++++ 3 files changed, 58 insertions(+), 11 deletions(-) diff --git a/src/ast/mod.rs b/src/ast/mod.rs index 8e7bec3f4..653f58e4d 100644 --- a/src/ast/mod.rs +++ b/src/ast/mod.rs @@ -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 + table: Option, }, /// ```sql /// DROP FUNCTION @@ -5242,17 +5245,24 @@ impl fmt::Display for Statement { restrict, purge, temporary, - } => write!( - f, - "DROP {}{}{} {}{}{}{}", - if *temporary { "TEMPORARY " } else { "" }, - object_type, - if *if_exists { " IF EXISTS" } else { "" }, - display_comma_separated(names), - if *cascade { " CASCADE" } else { "" }, - if *restrict { " RESTRICT" } else { "" }, - if *purge { " PURGE" } else { "" } - ), + table, + } => { + write!( + f, + "DROP {}{}{} {}{}{}{}", + if *temporary { "TEMPORARY " } else { "" }, + object_type, + if *if_exists { " IF EXISTS" } else { "" }, + display_comma_separated(names), + if *cascade { " CASCADE" } else { "" }, + if *restrict { " RESTRICT" } 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, diff --git a/src/parser/mod.rs b/src/parser/mod.rs index 4299d1566..c399bda42 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -6249,6 +6249,11 @@ impl<'a> Parser<'a> { loc ); } + // Mysql requires table specification on index drop + let table = match self.parse_keyword(Keyword::ON) { + true => Some(self.parse_object_name(false)?), + false => None, + }; Ok(Statement::Drop { object_type, if_exists, @@ -6257,6 +6262,7 @@ impl<'a> Parser<'a> { restrict, purge, temporary, + table, }) } diff --git a/tests/sqlparser_mysql.rs b/tests/sqlparser_mysql.rs index bcde14ee5..a5a96339b 100644 --- a/tests/sqlparser_mysql.rs +++ b/tests/sqlparser_mysql.rs @@ -3985,3 +3985,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::>() + ); + assert!(!cascade); + assert!(!restrict); + assert!(!purge); + assert!(!temporary); + assert!(table.is_some()); + assert_eq!("table_name", table.unwrap().to_string()); + } + _ => unreachable!(), + } +} From 2d0a7686d54246421e2d40d9997d0b4f28c07c88 Mon Sep 17 00:00:00 2001 From: Dmitriy Mazurin Date: Thu, 29 May 2025 11:37:23 +0100 Subject: [PATCH 2/2] Update src/parser/mod.rs Co-authored-by: Ifeanyi Ubah --- src/parser/mod.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/parser/mod.rs b/src/parser/mod.rs index c399bda42..103d31753 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -6249,10 +6249,10 @@ impl<'a> Parser<'a> { loc ); } - // Mysql requires table specification on index drop - let table = match self.parse_keyword(Keyword::ON) { - true => Some(self.parse_object_name(false)?), - false => None, + let table = if self.parse_keyword(Keyword::ON) { + Some(self.parse_object_name(false)?) + } else { + None }; Ok(Statement::Drop { object_type,