mirror of
https://github.com/apache/datafusion-sqlparser-rs.git
synced 2025-08-03 22:08:16 +00:00
feat: allow multiple actions in one ALTER TABLE
statement (#960)
This commit is contained in:
parent
e0afd4b179
commit
25e037c50f
7 changed files with 349 additions and 326 deletions
|
@ -30,8 +30,8 @@ use sqlparser::dialect::{
|
|||
use sqlparser::keywords::ALL_KEYWORDS;
|
||||
use sqlparser::parser::{Parser, ParserError, ParserOptions};
|
||||
use test_utils::{
|
||||
all_dialects, assert_eq_vec, expr_from_projection, join, number, only, table, table_alias,
|
||||
TestedDialects,
|
||||
all_dialects, alter_table_op, assert_eq_vec, expr_from_projection, join, number, only, table,
|
||||
table_alias, TestedDialects,
|
||||
};
|
||||
|
||||
#[macro_use]
|
||||
|
@ -2920,19 +2920,17 @@ fn parse_create_external_table_lowercase() {
|
|||
#[test]
|
||||
fn parse_alter_table() {
|
||||
let add_column = "ALTER TABLE tab ADD COLUMN foo TEXT;";
|
||||
match one_statement_parses_to(add_column, "ALTER TABLE tab ADD COLUMN foo TEXT") {
|
||||
Statement::AlterTable {
|
||||
name,
|
||||
operation:
|
||||
AlterTableOperation::AddColumn {
|
||||
column_keyword,
|
||||
if_not_exists,
|
||||
column_def,
|
||||
},
|
||||
match alter_table_op(one_statement_parses_to(
|
||||
add_column,
|
||||
"ALTER TABLE tab ADD COLUMN foo TEXT",
|
||||
)) {
|
||||
AlterTableOperation::AddColumn {
|
||||
column_keyword,
|
||||
if_not_exists,
|
||||
column_def,
|
||||
} => {
|
||||
assert!(column_keyword);
|
||||
assert!(!if_not_exists);
|
||||
assert_eq!("tab", name.to_string());
|
||||
assert_eq!("foo", column_def.name.to_string());
|
||||
assert_eq!("TEXT", column_def.data_type.to_string());
|
||||
}
|
||||
|
@ -2940,28 +2938,19 @@ fn parse_alter_table() {
|
|||
};
|
||||
|
||||
let rename_table = "ALTER TABLE tab RENAME TO new_tab";
|
||||
match verified_stmt(rename_table) {
|
||||
Statement::AlterTable {
|
||||
name,
|
||||
operation: AlterTableOperation::RenameTable { table_name },
|
||||
} => {
|
||||
assert_eq!("tab", name.to_string());
|
||||
assert_eq!("new_tab", table_name.to_string())
|
||||
match alter_table_op(verified_stmt(rename_table)) {
|
||||
AlterTableOperation::RenameTable { table_name } => {
|
||||
assert_eq!("new_tab", table_name.to_string());
|
||||
}
|
||||
_ => unreachable!(),
|
||||
};
|
||||
|
||||
let rename_column = "ALTER TABLE tab RENAME COLUMN foo TO new_foo";
|
||||
match verified_stmt(rename_column) {
|
||||
Statement::AlterTable {
|
||||
name,
|
||||
operation:
|
||||
AlterTableOperation::RenameColumn {
|
||||
old_column_name,
|
||||
new_column_name,
|
||||
},
|
||||
match alter_table_op(verified_stmt(rename_column)) {
|
||||
AlterTableOperation::RenameColumn {
|
||||
old_column_name,
|
||||
new_column_name,
|
||||
} => {
|
||||
assert_eq!("tab", name.to_string());
|
||||
assert_eq!(old_column_name.to_string(), "foo");
|
||||
assert_eq!(new_column_name.to_string(), "new_foo");
|
||||
}
|
||||
|
@ -3047,21 +3036,15 @@ fn parse_alter_view_with_columns() {
|
|||
|
||||
#[test]
|
||||
fn parse_alter_table_add_column() {
|
||||
match verified_stmt("ALTER TABLE tab ADD foo TEXT") {
|
||||
Statement::AlterTable {
|
||||
operation: AlterTableOperation::AddColumn { column_keyword, .. },
|
||||
..
|
||||
} => {
|
||||
match alter_table_op(verified_stmt("ALTER TABLE tab ADD foo TEXT")) {
|
||||
AlterTableOperation::AddColumn { column_keyword, .. } => {
|
||||
assert!(!column_keyword);
|
||||
}
|
||||
_ => unreachable!(),
|
||||
};
|
||||
|
||||
match verified_stmt("ALTER TABLE tab ADD COLUMN foo TEXT") {
|
||||
Statement::AlterTable {
|
||||
operation: AlterTableOperation::AddColumn { column_keyword, .. },
|
||||
..
|
||||
} => {
|
||||
match alter_table_op(verified_stmt("ALTER TABLE tab ADD COLUMN foo TEXT")) {
|
||||
AlterTableOperation::AddColumn { column_keyword, .. } => {
|
||||
assert!(column_keyword);
|
||||
}
|
||||
_ => unreachable!(),
|
||||
|
@ -3080,24 +3063,19 @@ fn parse_alter_table_add_column_if_not_exists() {
|
|||
options: None,
|
||||
};
|
||||
|
||||
match dialects.verified_stmt("ALTER TABLE tab ADD IF NOT EXISTS foo TEXT") {
|
||||
Statement::AlterTable {
|
||||
operation: AlterTableOperation::AddColumn { if_not_exists, .. },
|
||||
..
|
||||
} => {
|
||||
match alter_table_op(dialects.verified_stmt("ALTER TABLE tab ADD IF NOT EXISTS foo TEXT")) {
|
||||
AlterTableOperation::AddColumn { if_not_exists, .. } => {
|
||||
assert!(if_not_exists);
|
||||
}
|
||||
_ => unreachable!(),
|
||||
};
|
||||
|
||||
match dialects.verified_stmt("ALTER TABLE tab ADD COLUMN IF NOT EXISTS foo TEXT") {
|
||||
Statement::AlterTable {
|
||||
operation:
|
||||
AlterTableOperation::AddColumn {
|
||||
column_keyword,
|
||||
if_not_exists,
|
||||
..
|
||||
},
|
||||
match alter_table_op(
|
||||
dialects.verified_stmt("ALTER TABLE tab ADD COLUMN IF NOT EXISTS foo TEXT"),
|
||||
) {
|
||||
AlterTableOperation::AddColumn {
|
||||
column_keyword,
|
||||
if_not_exists,
|
||||
..
|
||||
} => {
|
||||
assert!(column_keyword);
|
||||
|
@ -3123,12 +3101,10 @@ fn parse_alter_table_constraints() {
|
|||
check_one("CHECK (end_date > start_date OR end_date IS NULL)");
|
||||
|
||||
fn check_one(constraint_text: &str) {
|
||||
match verified_stmt(&format!("ALTER TABLE tab ADD {constraint_text}")) {
|
||||
Statement::AlterTable {
|
||||
name,
|
||||
operation: AlterTableOperation::AddConstraint(constraint),
|
||||
} => {
|
||||
assert_eq!("tab", name.to_string());
|
||||
match alter_table_op(verified_stmt(&format!(
|
||||
"ALTER TABLE tab ADD {constraint_text}"
|
||||
))) {
|
||||
AlterTableOperation::AddConstraint(constraint) => {
|
||||
assert_eq!(constraint_text, constraint.to_string());
|
||||
}
|
||||
_ => unreachable!(),
|
||||
|
@ -3150,17 +3126,12 @@ fn parse_alter_table_drop_column() {
|
|||
);
|
||||
|
||||
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,
|
||||
},
|
||||
match alter_table_op(verified_stmt(&format!("ALTER TABLE tab {constraint_text}"))) {
|
||||
AlterTableOperation::DropColumn {
|
||||
column_name,
|
||||
if_exists,
|
||||
cascade,
|
||||
} => {
|
||||
assert_eq!("tab", name.to_string());
|
||||
assert_eq!("is_active", column_name.to_string());
|
||||
assert!(if_exists);
|
||||
assert!(cascade);
|
||||
|
@ -3173,12 +3144,10 @@ fn parse_alter_table_drop_column() {
|
|||
#[test]
|
||||
fn parse_alter_table_alter_column() {
|
||||
let alter_stmt = "ALTER TABLE tab";
|
||||
match verified_stmt(&format!("{alter_stmt} ALTER COLUMN is_active SET NOT NULL")) {
|
||||
Statement::AlterTable {
|
||||
name,
|
||||
operation: AlterTableOperation::AlterColumn { column_name, op },
|
||||
} => {
|
||||
assert_eq!("tab", name.to_string());
|
||||
match alter_table_op(verified_stmt(&format!(
|
||||
"{alter_stmt} ALTER COLUMN is_active SET NOT NULL"
|
||||
))) {
|
||||
AlterTableOperation::AlterColumn { column_name, op } => {
|
||||
assert_eq!("is_active", column_name.to_string());
|
||||
assert_eq!(op, AlterColumnOperation::SetNotNull {});
|
||||
}
|
||||
|
@ -3190,14 +3159,10 @@ fn parse_alter_table_alter_column() {
|
|||
"ALTER TABLE tab ALTER COLUMN is_active DROP NOT NULL",
|
||||
);
|
||||
|
||||
match verified_stmt(&format!(
|
||||
match alter_table_op(verified_stmt(&format!(
|
||||
"{alter_stmt} ALTER COLUMN is_active SET DEFAULT false"
|
||||
)) {
|
||||
Statement::AlterTable {
|
||||
name,
|
||||
operation: AlterTableOperation::AlterColumn { column_name, op },
|
||||
} => {
|
||||
assert_eq!("tab", name.to_string());
|
||||
))) {
|
||||
AlterTableOperation::AlterColumn { column_name, op } => {
|
||||
assert_eq!("is_active", column_name.to_string());
|
||||
assert_eq!(
|
||||
op,
|
||||
|
@ -3209,12 +3174,10 @@ fn parse_alter_table_alter_column() {
|
|||
_ => unreachable!(),
|
||||
}
|
||||
|
||||
match verified_stmt(&format!("{alter_stmt} ALTER COLUMN is_active DROP DEFAULT")) {
|
||||
Statement::AlterTable {
|
||||
name,
|
||||
operation: AlterTableOperation::AlterColumn { column_name, op },
|
||||
} => {
|
||||
assert_eq!("tab", name.to_string());
|
||||
match alter_table_op(verified_stmt(&format!(
|
||||
"{alter_stmt} ALTER COLUMN is_active DROP DEFAULT"
|
||||
))) {
|
||||
AlterTableOperation::AlterColumn { column_name, op } => {
|
||||
assert_eq!("is_active", column_name.to_string());
|
||||
assert_eq!(op, AlterColumnOperation::DropDefault {});
|
||||
}
|
||||
|
@ -3225,12 +3188,10 @@ fn parse_alter_table_alter_column() {
|
|||
#[test]
|
||||
fn parse_alter_table_alter_column_type() {
|
||||
let alter_stmt = "ALTER TABLE tab";
|
||||
match verified_stmt("ALTER TABLE tab ALTER COLUMN is_active SET DATA TYPE TEXT") {
|
||||
Statement::AlterTable {
|
||||
name,
|
||||
operation: AlterTableOperation::AlterColumn { column_name, op },
|
||||
} => {
|
||||
assert_eq!("tab", name.to_string());
|
||||
match alter_table_op(verified_stmt(
|
||||
"ALTER TABLE tab ALTER COLUMN is_active SET DATA TYPE TEXT",
|
||||
)) {
|
||||
AlterTableOperation::AlterColumn { column_name, op } => {
|
||||
assert_eq!("is_active", column_name.to_string());
|
||||
assert_eq!(
|
||||
op,
|
||||
|
@ -3267,34 +3228,28 @@ 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,
|
||||
},
|
||||
match alter_table_op(verified_stmt(
|
||||
"ALTER TABLE tab DROP CONSTRAINT constraint_name CASCADE",
|
||||
)) {
|
||||
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,
|
||||
},
|
||||
match alter_table_op(verified_stmt(
|
||||
"ALTER TABLE tab DROP CONSTRAINT IF EXISTS constraint_name",
|
||||
)) {
|
||||
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);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue