Keep the COLUMN keyword only if it exists when dropping the column (#1862)

This commit is contained in:
hulk 2025-05-28 13:09:40 +08:00 committed by GitHub
parent 301726541a
commit 9159d08c5e
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 12 additions and 4 deletions

View file

@ -139,6 +139,7 @@ pub enum AlterTableOperation {
},
/// `DROP [ COLUMN ] [ IF EXISTS ] <column_name> [ CASCADE ]`
DropColumn {
has_column_keyword: bool,
column_name: Ident,
if_exists: bool,
drop_behavior: Option<DropBehavior>,
@ -606,12 +607,14 @@ impl fmt::Display for AlterTableOperation {
AlterTableOperation::DropPrimaryKey => write!(f, "DROP PRIMARY KEY"),
AlterTableOperation::DropForeignKey { name } => write!(f, "DROP FOREIGN KEY {name}"),
AlterTableOperation::DropColumn {
has_column_keyword,
column_name,
if_exists,
drop_behavior,
} => write!(
f,
"DROP COLUMN {}{}{}",
"DROP {}{}{}{}",
if *has_column_keyword { "COLUMN " } else { "" },
if *if_exists { "IF EXISTS " } else { "" },
column_name,
match drop_behavior {

View file

@ -1090,6 +1090,7 @@ impl Spanned for AlterTableOperation {
drop_behavior: _,
} => name.span,
AlterTableOperation::DropColumn {
has_column_keyword: _,
column_name,
if_exists: _,
drop_behavior: _,

View file

@ -8608,11 +8608,12 @@ impl<'a> Parser<'a> {
} else if self.parse_keywords(&[Keyword::CLUSTERING, Keyword::KEY]) {
AlterTableOperation::DropClusteringKey
} else {
let _ = self.parse_keyword(Keyword::COLUMN); // [ COLUMN ]
let has_column_keyword = self.parse_keyword(Keyword::COLUMN); // [ COLUMN ]
let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
let column_name = self.parse_identifier()?;
let drop_behavior = self.parse_optional_drop_behavior();
AlterTableOperation::DropColumn {
has_column_keyword,
column_name,
if_exists,
drop_behavior,

View file

@ -4926,17 +4926,18 @@ fn parse_alter_table_drop_column() {
check_one("DROP COLUMN IF EXISTS is_active CASCADE");
check_one("DROP COLUMN IF EXISTS is_active RESTRICT");
one_statement_parses_to(
"ALTER TABLE tab DROP IF EXISTS is_active CASCADE",
"ALTER TABLE tab DROP COLUMN IF EXISTS is_active CASCADE",
"ALTER TABLE tab DROP COLUMN IF EXISTS is_active CASCADE",
);
one_statement_parses_to(
"ALTER TABLE tab DROP is_active CASCADE",
"ALTER TABLE tab DROP COLUMN is_active CASCADE",
"ALTER TABLE tab DROP is_active CASCADE",
);
fn check_one(constraint_text: &str) {
match alter_table_op(verified_stmt(&format!("ALTER TABLE tab {constraint_text}"))) {
AlterTableOperation::DropColumn {
has_column_keyword: true,
column_name,
if_exists,
drop_behavior,

View file

@ -2801,6 +2801,7 @@ fn parse_alter_table_with_algorithm() {
operations,
vec![
AlterTableOperation::DropColumn {
has_column_keyword: true,
column_name: Ident::new("password_digest"),
if_exists: false,
drop_behavior: None,
@ -2848,6 +2849,7 @@ fn parse_alter_table_with_lock() {
operations,
vec![
AlterTableOperation::DropColumn {
has_column_keyword: true,
column_name: Ident::new("password_digest"),
if_exists: false,
drop_behavior: None,