Skip to content

Commit aec0d2e

Browse files
committed
mysql support DROP INDEX idx_a ON table_a and ALTER TABLE table_a DROP INDEX idx_a
1 parent 3017265 commit aec0d2e

File tree

6 files changed

+85
-2
lines changed

6 files changed

+85
-2
lines changed

src/ast/ddl.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,14 @@ pub enum AlterTableOperation {
186186
DropForeignKey {
187187
name: Ident,
188188
},
189+
/// `DROP INDEX <index_name>`
190+
///
191+
/// Note: this is a [MySQL]-specific operation.
192+
///
193+
/// [MySQL]: https://dev.mysql.com/doc/refman/8.4/en/alter-table.html
194+
DropIndex {
195+
name: Ident,
196+
},
189197
/// `ENABLE ALWAYS RULE rewrite_rule_name`
190198
///
191199
/// Note: this is a PostgreSQL-specific operation.
@@ -605,6 +613,7 @@ impl fmt::Display for AlterTableOperation {
605613
}
606614
AlterTableOperation::DropPrimaryKey => write!(f, "DROP PRIMARY KEY"),
607615
AlterTableOperation::DropForeignKey { name } => write!(f, "DROP FOREIGN KEY {name}"),
616+
AlterTableOperation::DropIndex { name } => write!(f, "DROP INDEX {name}"),
608617
AlterTableOperation::DropColumn {
609618
column_name,
610619
if_exists,

src/ast/mod.rs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3208,6 +3208,17 @@ pub enum Statement {
32083208
/// `CREATE INDEX`
32093209
/// ```
32103210
CreateIndex(CreateIndex),
3211+
/// DROP INDEX
3212+
///
3213+
/// ```sql
3214+
/// DROP INDEX index_name ON tbl_name
3215+
/// ```
3216+
/// See [MySql](https://dev.mysql.com/doc/refman/8.4/en/drop-index.html)
3217+
/// TODO: No support `[algorithm_option | lock_option]`
3218+
DropIndex {
3219+
index_name: ObjectName,
3220+
table_name: Option<ObjectName>,
3221+
},
32113222
/// ```sql
32123223
/// CREATE ROLE
32133224
/// ```
@@ -4916,6 +4927,17 @@ impl fmt::Display for Statement {
49164927
Ok(())
49174928
}
49184929
Statement::CreateIndex(create_index) => create_index.fmt(f),
4930+
Statement::DropIndex {
4931+
index_name,
4932+
table_name,
4933+
} => {
4934+
write!(f, "DROP INDEX")?;
4935+
match &table_name {
4936+
Some(table_name) => write!(f, " {index_name} ON {table_name}")?,
4937+
None => write!(f, " {index_name}")?,
4938+
};
4939+
Ok(())
4940+
}
49194941
Statement::CreateExtension {
49204942
name,
49214943
if_not_exists,

src/ast/spans.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -421,6 +421,7 @@ impl Spanned for Statement {
421421
.chain(module_args.iter().map(|i| i.span)),
422422
),
423423
Statement::CreateIndex(create_index) => create_index.span(),
424+
Statement::DropIndex { .. } => Span::empty(),
424425
Statement::CreateRole { .. } => Span::empty(),
425426
Statement::CreateSecret { .. } => Span::empty(),
426427
Statement::CreateConnector { .. } => Span::empty(),
@@ -1110,6 +1111,7 @@ impl Spanned for AlterTableOperation {
11101111
.union_opt(&with_name.as_ref().map(|n| n.span)),
11111112
AlterTableOperation::DropPrimaryKey => Span::empty(),
11121113
AlterTableOperation::DropForeignKey { name } => name.span,
1114+
AlterTableOperation::DropIndex { name } => name.span,
11131115
AlterTableOperation::EnableAlwaysRule { name } => name.span,
11141116
AlterTableOperation::EnableAlwaysTrigger { name } => name.span,
11151117
AlterTableOperation::EnableReplicaRule { name } => name.span,

src/parser/mod.rs

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5347,6 +5347,24 @@ impl<'a> Parser<'a> {
53475347
})
53485348
}
53495349

5350+
/// Parse statements of the DropIndex type such as:
5351+
///
5352+
/// ```sql
5353+
/// DROP Index idx_name ON table_name
5354+
/// ```
5355+
pub fn parse_drop_index(&mut self) -> Result<Statement, ParserError> {
5356+
let index_name = self.parse_object_name(false)?;
5357+
let table_name = if self.parse_keyword(Keyword::ON) {
5358+
Some(self.parse_object_name(false)?)
5359+
} else {
5360+
None
5361+
};
5362+
Ok(Statement::DropIndex {
5363+
index_name,
5364+
table_name,
5365+
})
5366+
}
5367+
53505368
/// Parse statements of the DropTrigger type such as:
53515369
///
53525370
/// ```sql
@@ -6196,7 +6214,11 @@ impl<'a> Parser<'a> {
61966214
} else if self.parse_keywords(&[Keyword::MATERIALIZED, Keyword::VIEW]) {
61976215
ObjectType::MaterializedView
61986216
} else if self.parse_keyword(Keyword::INDEX) {
6199-
ObjectType::Index
6217+
if dialect_of!(self is MySqlDialect){
6218+
return self.parse_drop_index();
6219+
}else {
6220+
ObjectType::Index
6221+
}
62006222
} else if self.parse_keyword(Keyword::ROLE) {
62016223
ObjectType::Role
62026224
} else if self.parse_keyword(Keyword::SCHEMA) {
@@ -8599,6 +8621,9 @@ impl<'a> Parser<'a> {
85998621
} else if self.parse_keywords(&[Keyword::FOREIGN, Keyword::KEY]) {
86008622
let name = self.parse_identifier()?;
86018623
AlterTableOperation::DropForeignKey { name }
8624+
} else if self.parse_keyword(Keyword::INDEX) {
8625+
let name = self.parse_identifier()?;
8626+
AlterTableOperation::DropIndex { name }
86028627
} else if self.parse_keyword(Keyword::PROJECTION)
86038628
&& dialect_of!(self is ClickHouseDialect|GenericDialect)
86048629
{

tests/sqlparser_common.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9099,7 +9099,9 @@ fn test_create_index_with_with_clause() {
90999099
#[test]
91009100
fn parse_drop_index() {
91019101
let sql = "DROP INDEX idx_a";
9102-
match verified_stmt(sql) {
9102+
// MySql dialect doesn't support `DROP INDEX idx_a`,you need to specify a specific table, please refer:
9103+
// [MySql](https://dev.mysql.com/doc/refman/8.4/en/drop-index.html)
9104+
match all_dialects_except(|d| d.is::<MySqlDialect>()).verified_stmt(sql) {
91039105
Statement::Drop {
91049106
names, object_type, ..
91059107
} => {

tests/sqlparser_mysql.rs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3985,3 +3985,26 @@ fn parse_straight_join() {
39853985
mysql()
39863986
.verified_stmt("SELECT a.*, b.* FROM table_a STRAIGHT_JOIN table_b AS b ON a.b_id = b.id");
39873987
}
3988+
3989+
#[test]
3990+
fn parse_drop_index() {
3991+
let sql_drop_index = "DROP INDEX idx_name ON tab_name;";
3992+
let drop_stmt = mysql().one_statement_parses_to(sql_drop_index, "");
3993+
assert_eq!(
3994+
drop_stmt,
3995+
Statement::DropIndex {
3996+
index_name: ObjectName::from(vec![Ident::new("idx_name")]),
3997+
table_name: Some(ObjectName::from(vec![Ident::new("tab_name")])),
3998+
}
3999+
);
4000+
}
4001+
4002+
#[test]
4003+
fn parse_alter_table_drop_index() {
4004+
assert_matches!(
4005+
alter_table_op(
4006+
mysql_and_generic().verified_stmt("ALTER TABLE tab DROP INDEX idx_index")
4007+
),
4008+
AlterTableOperation::DropIndex { name } if name.value == "idx_index"
4009+
);
4010+
}

0 commit comments

Comments
 (0)