fix(core): uppercase dameng column types in structure ddl

Closes #7343
This commit is contained in:
t8y2
2026-08-27 17:23:40 +08:00
parent dfd4d3b7ff
commit bd6c780aba
2 changed files with 37 additions and 3 deletions
@@ -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 {
@@ -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::<String>::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");