mirror of
https://github.com/apache/datafusion-sqlparser-rs.git
synced 2025-08-22 15:04:04 +00:00
Support DROP CONSTRAINT [ IF EXISTS ] <name> [ CASCADE ]
(#396)
* adding support for DROP CONSTRAINT [ IF EXISTS ] <name> * implementing [ CASCADE ] for DROP CONSTRAINT
This commit is contained in:
parent
e4959696b5
commit
c4cbc8340a
3 changed files with 76 additions and 3 deletions
|
@ -32,8 +32,12 @@ pub enum AlterTableOperation {
|
||||||
AddConstraint(TableConstraint),
|
AddConstraint(TableConstraint),
|
||||||
/// `ADD [ COLUMN ] <column_def>`
|
/// `ADD [ COLUMN ] <column_def>`
|
||||||
AddColumn { column_def: ColumnDef },
|
AddColumn { column_def: ColumnDef },
|
||||||
/// TODO: implement `DROP CONSTRAINT <name>`
|
/// `DROP CONSTRAINT [ IF EXISTS ] <name>`
|
||||||
DropConstraint { name: Ident },
|
DropConstraint {
|
||||||
|
if_exists: bool,
|
||||||
|
name: Ident,
|
||||||
|
cascade: bool,
|
||||||
|
},
|
||||||
/// `DROP [ COLUMN ] [ IF EXISTS ] <column_name> [ CASCADE ]`
|
/// `DROP [ COLUMN ] [ IF EXISTS ] <column_name> [ CASCADE ]`
|
||||||
DropColumn {
|
DropColumn {
|
||||||
column_name: Ident,
|
column_name: Ident,
|
||||||
|
@ -107,7 +111,19 @@ impl fmt::Display for AlterTableOperation {
|
||||||
display_comma_separated(partitions),
|
display_comma_separated(partitions),
|
||||||
ie = if *if_exists { " IF EXISTS" } else { "" }
|
ie = if *if_exists { " IF EXISTS" } else { "" }
|
||||||
),
|
),
|
||||||
AlterTableOperation::DropConstraint { name } => write!(f, "DROP CONSTRAINT {}", name),
|
AlterTableOperation::DropConstraint {
|
||||||
|
if_exists,
|
||||||
|
name,
|
||||||
|
cascade,
|
||||||
|
} => {
|
||||||
|
write!(
|
||||||
|
f,
|
||||||
|
"DROP CONSTRAINT {}{}{}",
|
||||||
|
if *if_exists { "IF EXISTS " } else { "" },
|
||||||
|
name,
|
||||||
|
if *cascade { " CASCADE" } else { "" },
|
||||||
|
)
|
||||||
|
}
|
||||||
AlterTableOperation::DropColumn {
|
AlterTableOperation::DropColumn {
|
||||||
column_name,
|
column_name,
|
||||||
if_exists,
|
if_exists,
|
||||||
|
|
|
@ -2030,6 +2030,15 @@ impl<'a> Parser<'a> {
|
||||||
partitions,
|
partitions,
|
||||||
if_exists: false,
|
if_exists: false,
|
||||||
}
|
}
|
||||||
|
} else if self.parse_keyword(Keyword::CONSTRAINT) {
|
||||||
|
let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
|
||||||
|
let name = self.parse_identifier()?;
|
||||||
|
let cascade = self.parse_keyword(Keyword::CASCADE);
|
||||||
|
AlterTableOperation::DropConstraint {
|
||||||
|
if_exists,
|
||||||
|
name,
|
||||||
|
cascade,
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
let _ = self.parse_keyword(Keyword::COLUMN);
|
let _ = self.parse_keyword(Keyword::COLUMN);
|
||||||
let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
|
let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
|
||||||
|
|
|
@ -2077,6 +2077,54 @@ fn parse_alter_table_alter_column_type() {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn parse_alter_table_drop_constraint() {
|
||||||
|
let alter_stmt = "ALTER TABLE tab";
|
||||||
|
match verified_stmt("ALTER TABLE tab DROP CONSTRAINT constraint_name CASCADE") {
|
||||||
|
Statement::AlterTable {
|
||||||
|
name,
|
||||||
|
operation:
|
||||||
|
AlterTableOperation::DropConstraint {
|
||||||
|
name: constr_name,
|
||||||
|
if_exists,
|
||||||
|
cascade,
|
||||||
|
},
|
||||||
|
} => {
|
||||||
|
assert_eq!("tab", name.to_string());
|
||||||
|
assert_eq!("constraint_name", constr_name.to_string());
|
||||||
|
assert!(!if_exists);
|
||||||
|
assert!(cascade);
|
||||||
|
}
|
||||||
|
_ => unreachable!(),
|
||||||
|
}
|
||||||
|
match verified_stmt("ALTER TABLE tab DROP CONSTRAINT IF EXISTS constraint_name") {
|
||||||
|
Statement::AlterTable {
|
||||||
|
name,
|
||||||
|
operation:
|
||||||
|
AlterTableOperation::DropConstraint {
|
||||||
|
name: constr_name,
|
||||||
|
if_exists,
|
||||||
|
cascade,
|
||||||
|
},
|
||||||
|
} => {
|
||||||
|
assert_eq!("tab", name.to_string());
|
||||||
|
assert_eq!("constraint_name", constr_name.to_string());
|
||||||
|
assert!(if_exists);
|
||||||
|
assert!(!cascade);
|
||||||
|
}
|
||||||
|
_ => unreachable!(),
|
||||||
|
}
|
||||||
|
|
||||||
|
let res = Parser::parse_sql(
|
||||||
|
&GenericDialect {},
|
||||||
|
&format!("{} DROP CONSTRAINT is_active TEXT", alter_stmt),
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
ParserError::ParserError("Expected end of statement, found: TEXT".to_string()),
|
||||||
|
res.unwrap_err()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn parse_bad_constraint() {
|
fn parse_bad_constraint() {
|
||||||
let res = parse_sql_statements("ALTER TABLE tab ADD");
|
let res = parse_sql_statements("ALTER TABLE tab ADD");
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue