diff --git a/crates/dbx-sql-schema/src/table_structure_sql/column_alter.rs b/crates/dbx-sql-schema/src/table_structure_sql/column_alter.rs index df30634dc5..6d6909beb9 100644 --- a/crates/dbx-sql-schema/src/table_structure_sql/column_alter.rs +++ b/crates/dbx-sql-schema/src/table_structure_sql/column_alter.rs @@ -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(); diff --git a/crates/dbx-sql-schema/src/table_structure_sql/tests.rs b/crates/dbx-sql-schema/src/table_structure_sql/tests.rs index e570a77751..753c480527 100644 --- a/crates/dbx-sql-schema/src/table_structure_sql/tests.rs +++ b/crates/dbx-sql-schema/src/table_structure_sql/tests.rs @@ -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::::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");