diff --git a/crates/dbx-core/src/table_structure_sql/column_format.rs b/crates/dbx-core/src/table_structure_sql/column_format.rs index dbdc615748..3214829d02 100644 --- a/crates/dbx-core/src/table_structure_sql/column_format.rs +++ b/crates/dbx-core/src/table_structure_sql/column_format.rs @@ -162,7 +162,15 @@ pub(super) fn column_data_type(dialect: StructureDialect, column: &EditableStruc if dialect == StructureDialect::Questdb { return questdb_column_type(column); } - normalize_column_data_type(dialect, &column.data_type) + let normalized = normalize_column_data_type(dialect, &column.data_type); + // Dameng only recognizes its built-in type keywords in the canonical + // upper-case form: a lower-case `varchar(50)` in DDL is stored as a + // USER-DEFINED type instead of VARCHAR (issue #7343). Uppercase after the + // dialect-specific normalization so its rewrites still apply. + if dialect == StructureDialect::Dameng { + return normalized.to_uppercase(); + } + normalized } fn manticore_column_type(column: &EditableStructureColumn) -> String { diff --git a/crates/dbx-core/src/table_structure_sql/tests.rs b/crates/dbx-core/src/table_structure_sql/tests.rs index abd96de79d..919f1f2da6 100644 --- a/crates/dbx-core/src/table_structure_sql/tests.rs +++ b/crates/dbx-core/src/table_structure_sql/tests.rs @@ -772,8 +772,8 @@ fn dameng_integer_column_omits_mysql_display_width() { assert_eq!( result.statements, vec![ - "ALTER TABLE \"SYSDBA\".\"users\" ADD (\"age\" integer);", - "ALTER TABLE \"SYSDBA\".\"users\" ADD (\"amount\" number(10,0));", + "ALTER TABLE \"SYSDBA\".\"users\" ADD (\"age\" INTEGER);", + "ALTER TABLE \"SYSDBA\".\"users\" ADD (\"amount\" NUMBER(10,0));", ] ); } @@ -2778,6 +2778,32 @@ fn dameng_add_column_with_identity() { assert_eq!(result.statements, vec!["ALTER TABLE \"SYSDBA\".\"TEST\" ADD (\"ID\" INT IDENTITY(10, 2));"]); } +#[test] +fn dameng_uppercases_lowercase_column_type() { + let mut status = column("STATUS"); + status.data_type = "varchar(50)".to_string(); + + let result = build_table_structure_change_sql(TableStructureSqlOptions { + database_type: Some(DatabaseType::Dameng), + schema: Some("SYSDBA".to_string()), + table_name: "TEST".to_string(), + columns: vec![status], + indexes: Vec::new(), + foreign_keys: Vec::new(), + triggers: Vec::new(), + table_comment: None, + original_table_comment: None, + mysql_engine: None, + partitioned: false, + is_gaussdb_m_mode: false, + }); + + assert_eq!(result.warnings, Vec::::new()); + // A lower-case type keyword must not reach the DDL: Dameng would store it + // as a USER-DEFINED type instead of the built-in VARCHAR (issue #7343). + assert_eq!(result.statements, vec!["ALTER TABLE \"SYSDBA\".\"TEST\" ADD (\"STATUS\" VARCHAR(50));"]); +} + #[test] fn dameng_rejects_identity_on_incompatible_type() { let mut column = column("CODE");