mirror of
https://github.com/apache/datafusion-sqlparser-rs.git
synced 2025-08-23 23:44:07 +00:00
Implement ALTER TABLE DROP COLUMN (#148)
This implements `DROP [ COLUMN ] [ IF EXISTS ] column_name [ CASCADE ]` sub-command of `ALTER TABLE`, which is what PostgreSQL supports https://www.postgresql.org/docs/12/sql-altertable.html (except for the RESTRICT option) Co-authored-by: Nickolay Ponomarev <asqueella@gmail.com>
This commit is contained in:
parent
faeb7d440a
commit
26361fd854
4 changed files with 62 additions and 1 deletions
|
@ -31,6 +31,7 @@ Check https://github.com/andygrove/sqlparser-rs/commits/master for undocumented
|
|||
- Support bitwise AND (`&`), OR (`|`), XOR (`^`) (#181) - thanks @Dandandan!
|
||||
- Add serde support to AST structs and enums (#196) - thanks @panarch!
|
||||
- Support `ALTER TABLE ADD COLUMN`, `RENAME COLUMN`, and `RENAME TO` (#203) - thanks @mashuai!
|
||||
- Support `ALTER TABLE DROP COLUMN` (#148) - thanks @ivanceras!
|
||||
|
||||
### Fixed
|
||||
- Report an error for unterminated string literals (#165)
|
||||
|
|
|
@ -27,6 +27,12 @@ pub enum AlterTableOperation {
|
|||
AddColumn { column_def: ColumnDef },
|
||||
/// TODO: implement `DROP CONSTRAINT <name>`
|
||||
DropConstraint { name: Ident },
|
||||
/// `DROP [ COLUMN ] [ IF EXISTS ] <column_name> [ CASCADE ]`
|
||||
DropColumn {
|
||||
column_name: Ident,
|
||||
if_exists: bool,
|
||||
cascade: bool,
|
||||
},
|
||||
/// `RENAME [ COLUMN ] <old_column_name> TO <new_column_name>`
|
||||
RenameColumn {
|
||||
old_column_name: Ident,
|
||||
|
@ -44,6 +50,17 @@ impl fmt::Display for AlterTableOperation {
|
|||
write!(f, "ADD COLUMN {}", column_def.to_string())
|
||||
}
|
||||
AlterTableOperation::DropConstraint { name } => write!(f, "DROP CONSTRAINT {}", name),
|
||||
AlterTableOperation::DropColumn {
|
||||
column_name,
|
||||
if_exists,
|
||||
cascade,
|
||||
} => write!(
|
||||
f,
|
||||
"DROP COLUMN {}{}{}",
|
||||
if *if_exists { "IF EXISTS " } else { "" },
|
||||
column_name,
|
||||
if *cascade { " CASCADE" } else { "" }
|
||||
),
|
||||
AlterTableOperation::RenameColumn {
|
||||
old_column_name,
|
||||
new_column_name,
|
||||
|
|
|
@ -1340,8 +1340,18 @@ impl Parser {
|
|||
new_column_name,
|
||||
}
|
||||
}
|
||||
} else if self.parse_keyword(Keyword::DROP) {
|
||||
let _ = self.parse_keyword(Keyword::COLUMN);
|
||||
let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
|
||||
let column_name = self.parse_identifier()?;
|
||||
let cascade = self.parse_keyword(Keyword::CASCADE);
|
||||
AlterTableOperation::DropColumn {
|
||||
column_name,
|
||||
if_exists,
|
||||
cascade,
|
||||
}
|
||||
} else {
|
||||
return self.expected("ADD or RENAME after ALTER TABLE", self.peek_token());
|
||||
return self.expected("ADD, RENAME, or DROP after ALTER TABLE", self.peek_token());
|
||||
};
|
||||
Ok(Statement::AlterTable {
|
||||
name: table_name,
|
||||
|
|
|
@ -1388,6 +1388,39 @@ fn parse_alter_table_constraints() {
|
|||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn parse_alter_table_drop_column() {
|
||||
check_one("DROP COLUMN IF EXISTS is_active CASCADE");
|
||||
one_statement_parses_to(
|
||||
"ALTER TABLE tab DROP 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",
|
||||
);
|
||||
|
||||
fn check_one(constraint_text: &str) {
|
||||
match verified_stmt(&format!("ALTER TABLE tab {}", constraint_text)) {
|
||||
Statement::AlterTable {
|
||||
name,
|
||||
operation:
|
||||
AlterTableOperation::DropColumn {
|
||||
column_name,
|
||||
if_exists,
|
||||
cascade,
|
||||
},
|
||||
} => {
|
||||
assert_eq!("tab", name.to_string());
|
||||
assert_eq!("is_active", column_name.to_string());
|
||||
assert_eq!(true, if_exists);
|
||||
assert_eq!(true, cascade);
|
||||
}
|
||||
_ => unreachable!(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn parse_bad_constraint() {
|
||||
let res = parse_sql_statements("ALTER TABLE tab ADD");
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue