Parse MySQL ALTER TABLE DROP FOREIGN KEY syntax (#1762)

This commit is contained in:
Michael Victor Zink 2025-03-11 23:34:18 -07:00 committed by GitHub
parent 6ec5223f50
commit 1e54a34acd
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 27 additions and 4 deletions

View file

@ -151,8 +151,18 @@ pub enum AlterTableOperation {
},
/// `DROP PRIMARY KEY`
///
/// Note: this is a MySQL-specific operation.
/// Note: this is a [MySQL]-specific operation.
///
/// [MySQL]: https://dev.mysql.com/doc/refman/8.4/en/alter-table.html
DropPrimaryKey,
/// `DROP FOREIGN KEY <fk_symbol>`
///
/// Note: this is a [MySQL]-specific operation.
///
/// [MySQL]: https://dev.mysql.com/doc/refman/8.4/en/alter-table.html
DropForeignKey {
name: Ident,
},
/// `ENABLE ALWAYS RULE rewrite_rule_name`
///
/// Note: this is a PostgreSQL-specific operation.
@ -530,6 +540,7 @@ impl fmt::Display for AlterTableOperation {
)
}
AlterTableOperation::DropPrimaryKey => write!(f, "DROP PRIMARY KEY"),
AlterTableOperation::DropForeignKey { name } => write!(f, "DROP FOREIGN KEY {name}"),
AlterTableOperation::DropColumn {
column_name,
if_exists,

View file

@ -998,6 +998,7 @@ impl Spanned for AlterTableOperation {
.span()
.union_opt(&with_name.as_ref().map(|n| n.span)),
AlterTableOperation::DropPrimaryKey => Span::empty(),
AlterTableOperation::DropForeignKey { name } => name.span,
AlterTableOperation::EnableAlwaysRule { name } => name.span,
AlterTableOperation::EnableAlwaysTrigger { name } => name.span,
AlterTableOperation::EnableReplicaRule { name } => name.span,

View file

@ -7998,10 +7998,11 @@ impl<'a> Parser<'a> {
name,
drop_behavior,
}
} else if self.parse_keywords(&[Keyword::PRIMARY, Keyword::KEY])
&& dialect_of!(self is MySqlDialect | GenericDialect)
{
} else if self.parse_keywords(&[Keyword::PRIMARY, Keyword::KEY]) {
AlterTableOperation::DropPrimaryKey
} else if self.parse_keywords(&[Keyword::FOREIGN, Keyword::KEY]) {
let name = self.parse_identifier()?;
AlterTableOperation::DropForeignKey { name }
} else if self.parse_keyword(Keyword::PROJECTION)
&& dialect_of!(self is ClickHouseDialect|GenericDialect)
{

View file

@ -2273,6 +2273,16 @@ fn parse_alter_table_drop_primary_key() {
);
}
#[test]
fn parse_alter_table_drop_foreign_key() {
assert_matches!(
alter_table_op(
mysql_and_generic().verified_stmt("ALTER TABLE tab DROP FOREIGN KEY foo_ibfk_1")
),
AlterTableOperation::DropForeignKey { name } if name.value == "foo_ibfk_1"
);
}
#[test]
fn parse_alter_table_change_column() {
let expected_name = ObjectName::from(vec![Ident::new("orders")]);