feat(structure): disable Oracle-like integer length

This commit is contained in:
t8y2 committed 2026-07-04 23:17:51 +08:00
1 parent 3ba617fc74
commit cec17844a9
4 files changed
+77

No files matched your search

@@ -138,6 +138,11 @@ pub(super) fn normalize_column_data_type(dialect: StructureDialect, data_type: &
}
}
if is_oracle_like(dialect) && is_oracle_lengthless_type(base_type) {
// Dameng/Oracle integer aliases do not accept MySQL-style display widths like INTEGER(11).
return base_type.to_string();
}
if is_temporal_precision_type(dialect, base_type) {
return if is_valid_temporal_precision(params, dialect) {
format!("{base_type}({params})")
@@ -149,6 +154,32 @@ pub(super) fn normalize_column_data_type(dialect: StructureDialect, data_type: &
trimmed.to_string()
}
fn is_oracle_lengthless_type(base_type: &str) -> bool {
let normalized = base_type.split_whitespace().collect::<Vec<_>>().join(" ").to_ascii_lowercase();
matches!(
normalized.as_str(),
"binary_double"
| "binary_float"
| "bigint"
| "boolean"
| "bool"
| "byte"
| "date"
| "double"
| "double precision"
| "float"
| "integer"
| "int"
| "long"
| "long raw"
| "nclob"
| "real"
| "smallint"
| "text"
| "tinyint"
)
}
fn normalize_mysql_numeric_attribute_type(base_type: &str, params: &str) -> Option<String> {
let mut parts: Vec<&str> = base_type.split_whitespace().collect();
let type_name = parts.first().copied()?.to_ascii_lowercase();
@@ -138,6 +138,35 @@ fn builds_mysql_unsigned_integer_column_with_length_before_attribute() {
assert_eq!(result.statements, vec!["ALTER TABLE `users` ADD COLUMN `score` int(11) unsigned;"]);
}
#[test]
fn dameng_integer_column_omits_mysql_display_width() {
let mut age = column("age");
age.data_type = "integer(11)".to_string();
let mut amount = column("amount");
amount.data_type = "number(10,0)".to_string();
let result = build_table_structure_change_sql(TableStructureSqlOptions {
database_type: Some(DatabaseType::Dameng),
schema: Some("SYSDBA".to_string()),
table_name: "users".to_string(),
columns: vec![age, amount],
indexes: Vec::new(),
foreign_keys: Vec::new(),
triggers: Vec::new(),
table_comment: None,
original_table_comment: None,
});
assert_eq!(result.warnings, Vec::<String>::new());
assert_eq!(
result.statements,
vec![
"ALTER TABLE \"SYSDBA\".\"users\" ADD (\"age\" integer);",
"ALTER TABLE \"SYSDBA\".\"users\" ADD (\"amount\" number(10,0));",
]
);
}
#[test]
fn builds_highgo_foreign_key_changes_with_postgres_syntax() {
let mut old_fk = foreign_key("orders_user_id_fkey", "user_id", "users", "id");