fix(dameng): rename columns via ALTER COLUMN RENAME TO

This commit is contained in:
zipg
2026-10-19 02:51:49 +08:00
committed by GitHub
parent d470f4f660
commit 19a5a3ad5a
2 changed files with 65 additions and 5 deletions
@@ -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");