From 6eb134c0d6135973963da30d32328e5aea9b8c5c Mon Sep 17 00:00:00 2001 From: Alex Groleau Date: Fri, 20 Mar 2026 05:17:28 -0400 Subject: [PATCH] test checkpoint --- src/merger/mod.rs | 40 ++++++++++++++++++++++++++++++++++------ 1 file changed, 34 insertions(+), 6 deletions(-) diff --git a/src/merger/mod.rs b/src/merger/mod.rs index da6e8ef..4161eb6 100644 --- a/src/merger/mod.rs +++ b/src/merger/mod.rs @@ -622,11 +622,7 @@ impl Merger { for key in &sorted_keys { columns.push(format!("\"{}\"", key)); let val = entity_pairs.get(key).unwrap(); - if val.as_str() == Some("") { - values.push("NULL".to_string()); - } else { - values.push(Self::quote_literal(val)); - } + values.push(Self::format_sql_value(val, key, entity_type)); } if columns.is_empty() { @@ -660,7 +656,11 @@ impl Merger { if val.as_str() == Some("") { set_clauses.push(format!("\"{}\" = NULL", key)); } else { - set_clauses.push(format!("\"{}\" = {}", key, Self::quote_literal(val))); + set_clauses.push(format!( + "\"{}\" = {}", + key, + Self::format_sql_value(val, key, entity_type) + )); } } @@ -841,6 +841,34 @@ impl Merger { } } + fn format_sql_value(val: &Value, key: &str, entity_type: &Type) -> String { + if val.as_str() == Some("") { + return "NULL".to_string(); + } + + let mut is_pg_array = false; + if let Some(field_types_map) = entity_type.field_types.as_ref().and_then(|v| v.as_object()) { + if let Some(t_val) = field_types_map.get(key) { + if let Some(t_str) = t_val.as_str() { + if t_str.starts_with('_') { + is_pg_array = true; + } + } + } + } + + if is_pg_array && val.is_array() { + let mut s = val.to_string(); + if s.starts_with('[') && s.ends_with(']') { + s.replace_range(0..1, "{"); + s.replace_range(s.len() - 1..s.len(), "}"); + } + Self::quote_literal(&Value::String(s)) + } else { + Self::quote_literal(val) + } + } + fn quote_literal(val: &Value) -> String { match val { Value::Null => "NULL".to_string(),