fix(core): Oracle 复制 INSERT 按行生成语句
* fix(core): emit oracle copy inserts per row * refactor(core): extract single-row insert dialect check into sql_dialect --------- Co-authored-by: zero <zero@zeroMacmini.local> Co-authored-by: t8y2 <1156263951@qq.com>
This commit is contained in:
4 files changed
+70
-4
No files matched your search
@@ -12,7 +12,8 @@ use data_grid_tdengine_sql::build_tdengine_data_grid_save_statements;
|
||||
|
||||
use crate::models::connection::DatabaseType;
|
||||
use crate::sql_dialect::{
|
||||
firebird_rows_clause, quote_table_identifier, table_pagination_strategy, TablePaginationStrategy,
|
||||
firebird_rows_clause, quote_table_identifier, table_pagination_strategy, uses_single_row_insert_statements,
|
||||
TablePaginationStrategy,
|
||||
};
|
||||
use crate::transfer::{format_ch_array_sql_literal, format_pg_array_sql_literal};
|
||||
|
||||
@@ -358,6 +359,15 @@ pub fn build_data_grid_copy_insert_statement(options: DataGridCopyInsertStatemen
|
||||
)
|
||||
})
|
||||
.collect::<Vec<_>>();
|
||||
if options.database_type.is_some_and(uses_single_row_insert_statements) {
|
||||
return Some(
|
||||
value_rows
|
||||
.iter()
|
||||
.map(|values| format!("INSERT INTO {table} ({columns}) VALUES {values};"))
|
||||
.collect::<Vec<_>>()
|
||||
.join("\n"),
|
||||
);
|
||||
}
|
||||
Some(format!(
|
||||
"INSERT INTO {table} ({columns}) VALUES{}{};",
|
||||
if value_rows.len() == 1 { " " } else { "\n" },
|
||||
@@ -2064,6 +2074,28 @@ mod tests {
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn oracle_copy_insert_statement_uses_one_statement_per_row() {
|
||||
let statement = build_data_grid_copy_insert_statement(DataGridCopyInsertStatementOptions {
|
||||
database_type: Some(DatabaseType::Oracle),
|
||||
table_meta: Some(DataGridTableMeta {
|
||||
schema: Some("APP".to_string()),
|
||||
table_name: "USERS".to_string(),
|
||||
primary_keys: vec!["ID".to_string()],
|
||||
columns: None,
|
||||
}),
|
||||
columns: vec!["ID".to_string(), "NAME".to_string()],
|
||||
source_columns: None,
|
||||
rows: vec![vec![json!(1), json!("Ada")], vec![json!(2), json!("Linus")]],
|
||||
exclude_primary_keys: false,
|
||||
});
|
||||
|
||||
assert_eq!(
|
||||
statement.as_deref(),
|
||||
Some("INSERT INTO \"APP\".\"USERS\" (\"ID\", \"NAME\") VALUES (1, 'Ada');\nINSERT INTO \"APP\".\"USERS\" (\"ID\", \"NAME\") VALUES (2, 'Linus');")
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn mysql_copy_statements_preserve_blob_hex_literals() {
|
||||
let table_meta = DataGridTableMeta {
|
||||
|
||||
Reference in new issue
Block a user