fix(dameng): wrap identity columns when pasting table data
This commit is contained in:
4 files changed
+58
-1
No files matched your search
@@ -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,
|
||||
});
|
||||
|
||||
Reference in new issue
Block a user