fix(dameng): wrap identity columns when pasting table data

This commit is contained in:
弈秋 authored and GitHub committed 2026-09-21 19:04:29 +08:00
1 parent be055a60cc
commit 0c6fc610cd
4 files changed
+58 -1

No files matched your search

+43 -1
View File
@@ -241,6 +241,8 @@ pub struct CopyTableDataSqlOptions {
#[serde(default)]
pub sqlserver_identity_insert: bool,
#[serde(default)]
pub dameng_identity_insert: bool,
#[serde(default)]
pub normalize_new_target_name: bool,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub identifier_quote: Option<String>,
@@ -895,7 +897,10 @@ pub fn build_copy_table_data_sql(options: CopyTableDataSqlOptions) -> String {
let insert_sql = format!(
"INSERT INTO {target} ({target_column_list}){postgres_override} SELECT {source_column_list} FROM {source};"
);
if options.sqlserver_identity_insert && options.database_type == Some(DatabaseType::SqlServer) {
let needs_identity_insert = (options.sqlserver_identity_insert
&& options.database_type == Some(DatabaseType::SqlServer))
|| (options.dameng_identity_insert && options.database_type == Some(DatabaseType::Dameng));
if needs_identity_insert {
return format!("SET IDENTITY_INSERT {target} ON;\n{insert_sql}\nSET IDENTITY_INSERT {target} OFF;");
}
insert_sql
@@ -2554,6 +2559,7 @@ mod tests {
columns: None,
postgres_overriding_system_value: false,
sqlserver_identity_insert: false,
dameng_identity_insert: false,
normalize_new_target_name: false,
identifier_quote: None,
}),
@@ -2568,6 +2574,7 @@ mod tests {
columns: Some(vec!["id".to_string(), "name".to_string()]),
postgres_overriding_system_value: false,
sqlserver_identity_insert: false,
dameng_identity_insert: false,
normalize_new_target_name: false,
identifier_quote: None,
}),
@@ -2582,6 +2589,7 @@ mod tests {
columns: Some(vec!["id".to_string(), "name".to_string()]),
postgres_overriding_system_value: true,
sqlserver_identity_insert: false,
dameng_identity_insert: false,
normalize_new_target_name: false,
identifier_quote: None,
}),
@@ -2596,11 +2604,40 @@ mod tests {
columns: Some(vec!["id".to_string(), "name".to_string()]),
postgres_overriding_system_value: false,
sqlserver_identity_insert: true,
dameng_identity_insert: false,
normalize_new_target_name: false,
identifier_quote: None,
}),
"SET IDENTITY_INSERT [dbo].[users_copy] ON;\nINSERT INTO [dbo].[users_copy] ([id], [name]) SELECT [id], [name] FROM [dbo].[users];\nSET IDENTITY_INSERT [dbo].[users_copy] OFF;"
);
{
let dameng = build_copy_table_data_sql(CopyTableDataSqlOptions {
database_type: Some(DatabaseType::Dameng),
schema: Some("DCSS".to_string()),
source_name: "users".to_string(),
target_name: "users_copy".to_string(),
columns: Some(vec!["id".to_string(), "name".to_string()]),
postgres_overriding_system_value: false,
sqlserver_identity_insert: false,
dameng_identity_insert: true,
normalize_new_target_name: false,
identifier_quote: None,
});
assert!(dameng.starts_with("SET IDENTITY_INSERT "), "dameng copy should enable identity insert: {dameng}");
assert!(dameng.ends_with("OFF;"), "dameng copy should disable identity insert: {dameng}");
assert!(
dameng.contains("INSERT INTO ") && dameng.contains(" SELECT "),
"dameng copy should carry an INSERT..SELECT: {dameng}"
);
// Dameng rejects assigning an identity column unless a column list is specified.
assert!(
dameng.contains("(\"id\", \"name\")")
|| dameng.contains("(`id`, `name`)")
|| dameng.contains("(id, name)")
|| dameng.contains("([id], [name])"),
"dameng copy must use an explicit column list: {dameng}"
);
}
assert_eq!(
build_copy_table_data_sql(CopyTableDataSqlOptions {
database_type: Some(DatabaseType::Dameng),
@@ -2610,6 +2647,7 @@ mod tests {
columns: None,
postgres_overriding_system_value: false,
sqlserver_identity_insert: false,
dameng_identity_insert: false,
normalize_new_target_name: true,
identifier_quote: None,
}),
@@ -2624,6 +2662,7 @@ mod tests {
columns: None,
postgres_overriding_system_value: false,
sqlserver_identity_insert: false,
dameng_identity_insert: false,
normalize_new_target_name: false,
identifier_quote: None,
}),
@@ -2638,6 +2677,7 @@ mod tests {
columns: Some(vec!["user_id".to_string(), "userName".to_string(), "order total".to_string()]),
postgres_overriding_system_value: false,
sqlserver_identity_insert: false,
dameng_identity_insert: false,
normalize_new_target_name: true,
identifier_quote: None,
}),
@@ -2652,6 +2692,7 @@ mod tests {
columns: Some(vec!["user_id".to_string()]),
postgres_overriding_system_value: false,
sqlserver_identity_insert: false,
dameng_identity_insert: false,
normalize_new_target_name: false,
identifier_quote: None,
}),
@@ -2711,6 +2752,7 @@ mod tests {
columns: Some(vec!["user_id".to_string(), "userName".to_string()]),
postgres_overriding_system_value: false,
sqlserver_identity_insert: false,
dameng_identity_insert: false,
normalize_new_target_name: true,
identifier_quote: None,
});