diff --git a/src/ast/ddl.rs b/src/ast/ddl.rs index cae0f597b..c758b4f55 100644 --- a/src/ast/ddl.rs +++ b/src/ast/ddl.rs @@ -44,6 +44,10 @@ pub enum AlterTableOperation { if_exists: bool, cascade: bool, }, + /// `DROP PRIMARY KEY` + /// + /// Note: this is a MySQL-specific operation. + DropPrimaryKey, /// `RENAME TO PARTITION (partition=val)` RenamePartitions { old_partitions: Vec, @@ -124,6 +128,7 @@ impl fmt::Display for AlterTableOperation { if *cascade { " CASCADE" } else { "" }, ) } + AlterTableOperation::DropPrimaryKey => write!(f, "DROP PRIMARY KEY"), AlterTableOperation::DropColumn { column_name, if_exists, diff --git a/src/parser.rs b/src/parser.rs index 108427889..d1c2911fc 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -3136,6 +3136,10 @@ impl<'a> Parser<'a> { name, cascade, } + } else if self.parse_keywords(&[Keyword::PRIMARY, Keyword::KEY]) + && dialect_of!(self is MySqlDialect | GenericDialect) + { + AlterTableOperation::DropPrimaryKey } else { let _ = self.parse_keyword(Keyword::COLUMN); let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]); diff --git a/tests/sqlparser_mysql.rs b/tests/sqlparser_mysql.rs index 8c42c715b..52c0205d6 100644 --- a/tests/sqlparser_mysql.rs +++ b/tests/sqlparser_mysql.rs @@ -875,6 +875,19 @@ fn parse_update_with_joins() { } } +#[test] +fn parse_alter_table_drop_primary_key() { + match mysql_and_generic().verified_stmt("ALTER TABLE tab DROP PRIMARY KEY") { + Statement::AlterTable { + name, + operation: AlterTableOperation::DropPrimaryKey, + } => { + assert_eq!("tab", name.to_string()); + } + _ => unreachable!(), + } +} + #[test] fn parse_alter_table_change_column() { let expected_name = ObjectName(vec![Ident::new("orders")]);