mirror of
https://github.com/t8y2/dbx.git
synced 2026-10-19 16:16:45 +00:00
fix(dameng): rename columns via ALTER COLUMN RENAME TO
This commit is contained in:
@@ -752,11 +752,24 @@ pub(super) fn build_oracle_like_existing_column_sql(
|
||||
let mut statements = Vec::new();
|
||||
let mut current_name = original.name.clone();
|
||||
if column.name != original.name {
|
||||
statements.push(format!(
|
||||
"ALTER TABLE {table} RENAME COLUMN {} TO {};",
|
||||
quote_ident(dialect, &original.name),
|
||||
quote_ident(dialect, &column.name)
|
||||
));
|
||||
// Dameng accepts the Oracle-style MODIFY (…) but not `RENAME COLUMN`:
|
||||
// the supported form is `ALTER COLUMN old RENAME TO new` (verified on
|
||||
// DM8 8.1.3.62). Oracle and the other Oracle-compatible dialects keep
|
||||
// the RENAME COLUMN form.
|
||||
let rename = if dialect == StructureDialect::Dameng {
|
||||
format!(
|
||||
"ALTER TABLE {table} ALTER COLUMN {} RENAME TO {};",
|
||||
quote_ident(dialect, &original.name),
|
||||
quote_ident(dialect, &column.name)
|
||||
)
|
||||
} else {
|
||||
format!(
|
||||
"ALTER TABLE {table} RENAME COLUMN {} TO {};",
|
||||
quote_ident(dialect, &original.name),
|
||||
quote_ident(dialect, &column.name)
|
||||
)
|
||||
};
|
||||
statements.push(rename);
|
||||
current_name = column.name.clone();
|
||||
}
|
||||
let type_changed = column.data_type.trim() != original.data_type.trim();
|
||||
|
||||
@@ -7251,6 +7251,53 @@ fn dameng_alter_column_preserves_character_length_unit() {
|
||||
assert_eq!(result.statements, vec!["ALTER TABLE \"SYSDBA\".\"USERS\" MODIFY (\"NAME\" VARCHAR2(64 BYTE));"]);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn dameng_rename_column_uses_alter_column_rename_to() {
|
||||
let mut renamed = column("NAME");
|
||||
renamed.name = "NEW_NAME".to_string();
|
||||
renamed.data_type = "VARCHAR2(64)".to_string();
|
||||
renamed.original = Some(ColumnInfo {
|
||||
name: "NAME".to_string(),
|
||||
data_type: "VARCHAR2(64)".to_string(),
|
||||
is_nullable: true,
|
||||
column_default: None,
|
||||
is_primary_key: false,
|
||||
extra: None,
|
||||
comment: None,
|
||||
..Default::default()
|
||||
});
|
||||
|
||||
let result = build_table_structure_change_sql(TableStructureSqlOptions {
|
||||
database_type: Some(DatabaseType::Dameng),
|
||||
driver_profile: None,
|
||||
schema: Some("SYSDBA".to_string()),
|
||||
table_name: "USERS".to_string(),
|
||||
columns: vec![renamed],
|
||||
indexes: Vec::new(),
|
||||
foreign_keys: Vec::new(),
|
||||
triggers: Vec::new(),
|
||||
table_comment: None,
|
||||
original_table_comment: None,
|
||||
mysql_engine: None,
|
||||
mysql_auto_increment_value: None,
|
||||
transwarp_create: None,
|
||||
partitioned: false,
|
||||
foreign_table: false,
|
||||
is_gaussdb_m_mode: false,
|
||||
table_collation: None,
|
||||
primary_key_name: None,
|
||||
primary_key_change: None,
|
||||
oracle_constraint_changes: None,
|
||||
oracle_foreign_key_changes: None,
|
||||
});
|
||||
|
||||
assert_eq!(result.warnings, Vec::<String>::new());
|
||||
assert_eq!(
|
||||
result.statements,
|
||||
vec!["ALTER TABLE \"SYSDBA\".\"USERS\" ALTER COLUMN \"NAME\" RENAME TO \"NEW_NAME\";"]
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn dameng_rejects_multiple_identity_columns() {
|
||||
let mut first = column("ID");
|
||||
|
||||
Reference in New Issue
Block a user