fix(dameng): export bit values as numeric literals

This commit is contained in:
zipg 2026-07-16 15:21:44 +08:00 committed by GitHub
parent 36d8fabc8f
commit 96b5a71fb3
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 44 additions and 1 deletions

View File

@ -171,6 +171,9 @@ fn format_export_sql_literal_for_database(value: &Value, database_type: Option<D
return number.to_string();
}
if let Some(value) = value.as_bool() {
if database_type == Some(DatabaseType::Dameng) {
return if value { "1" } else { "0" }.to_string();
}
return if value { "TRUE" } else { "FALSE" }.to_string();
}
if let Some(arr) = value.as_array() {
@ -1843,6 +1846,27 @@ mod tests {
);
}
#[test]
fn dameng_bit_columns_export_as_numeric_literals() {
let statements = build_export_insert_statements(BuildExportInsertStatementsOptions {
database_type: Some(DatabaseType::Dameng),
schema: Some("DBX_TEST".to_string()),
table_name: Some("FLAGS".to_string()),
qualified_table_name: None,
columns: vec!["ENABLED".to_string(), "DELETED".to_string(), "OPTIONAL".to_string()],
column_types: vec![Some("BIT".to_string()), Some("bit".to_string()), Some("BIT".to_string())],
column_extras: Vec::new(),
rows: vec![vec![json!(true), json!(false), Value::Null]],
batch_size: Some(10),
})
.unwrap();
assert_eq!(
statements,
vec!["INSERT INTO \"DBX_TEST\".\"FLAGS\" (\"ENABLED\", \"DELETED\", \"OPTIONAL\") VALUES (1, 0, NULL);"]
);
}
#[test]
fn mysql_export_uses_typed_literals_for_numeric_and_blob_columns() {
let statements = build_export_insert_statements(BuildExportInsertStatementsOptions {

View File

@ -1038,7 +1038,7 @@ pub fn escape_value_typed(val: &serde_json::Value, db_type: &DatabaseType, colum
}
}
}
DatabaseType::SqlServer => {
DatabaseType::SqlServer | DatabaseType::Dameng => {
if *b {
"1".to_string()
} else {
@ -6144,6 +6144,25 @@ mod tests {
assert_eq!(sql, "INSERT INTO [dbo].[flags] ([enabled], [deleted]) VALUES\n(1, 0)");
}
#[test]
fn dameng_insert_formats_bit_booleans_as_numeric_literals() {
let sql = generate_insert_typed(
&[String::from("enabled"), String::from("deleted"), String::from("optional")],
&[Some(String::from("BIT")), Some(String::from("bit")), Some(String::from("BIT"))],
&[vec![json!(true), json!(false), serde_json::Value::Null]],
"flags",
"DBX_TEST",
&DatabaseType::Dameng,
);
assert_eq!(
sql,
"INSERT INTO \"DBX_TEST\".\"flags\" (\"enabled\", \"deleted\", \"optional\") VALUES\n(1, 0, NULL)"
);
assert!(!sql.contains("TRUE"));
assert!(!sql.contains("FALSE"));
}
#[test]
fn sqlserver_upsert_formats_bit_booleans_as_numeric_literals() {
let sql = generate_upsert_typed(