fix(import): use single-row inserts for Oracle

This commit is contained in:
t8y2 2026-07-03 18:04:23 +08:00
parent 55aa0f8624
commit a8abb1c478
1 changed files with 44 additions and 1 deletions

View File

@ -370,7 +370,12 @@ pub fn build_import_insert_batches(
.map(|(_, data_type)| data_type.clone())
})
.collect::<Vec<_>>();
let batch_size = batch_size.max(1);
let batch_size = match db_type {
// Oracle-compatible drivers reject INSERT ... VALUES (...), (...), so
// keep import batches executable as single-row statements.
DatabaseType::Oracle | DatabaseType::OceanbaseOracle => 1,
_ => batch_size.max(1),
};
let mut batches = Vec::new();
for chunk in data.rows.chunks(batch_size) {
@ -640,6 +645,44 @@ mod tests {
]);
}
#[test]
fn oracle_import_insert_batches_use_single_row_statements() {
let mappings = vec![
TableImportColumnMapping { source_column: "id".to_string(), target_column: "id".to_string() },
TableImportColumnMapping { source_column: "name".to_string(), target_column: "name".to_string() },
];
let data = ParsedImportFile {
columns: vec!["id".to_string(), "name".to_string()],
rows: vec![
vec![serde_json::json!(1), serde_json::json!("Ada")],
vec![serde_json::json!(2), serde_json::json!("Grace")],
vec![serde_json::json!(3), serde_json::Value::Null],
],
total_rows: 3,
};
let batches =
build_import_insert_batches(&data, &mappings, &[], "users", "HR", &DatabaseType::Oracle, 500).unwrap();
assert_eq!(
batches,
vec![
ImportSqlBatch {
sql: "INSERT INTO \"HR\".\"users\" (\"id\", \"name\") VALUES\n(1, 'Ada')".to_string(),
row_count: 1,
},
ImportSqlBatch {
sql: "INSERT INTO \"HR\".\"users\" (\"id\", \"name\") VALUES\n(2, 'Grace')".to_string(),
row_count: 1,
},
ImportSqlBatch {
sql: "INSERT INTO \"HR\".\"users\" (\"id\", \"name\") VALUES\n(3, NULL)".to_string(),
row_count: 1,
},
]
);
}
#[test]
fn import_insert_batches_use_target_column_types_for_mysql_temporal_values() {
let mappings = vec![