Skip to content

Commit b83f84a

Browse files
committed
fix: handle lowercase bools and wide integers in sql_string_to_json
- Accept case-insensitive TRUE/FALSE (serde_json::Value::Bool produces lowercase "true"/"false") - Try u64 parse before f64 to avoid precision loss on values above i64::MAX - Only attempt f64 parse when string contains '.', 'e', or 'E' - Add test cases for both edge cases
1 parent 47e5e9c commit b83f84a

1 file changed

Lines changed: 23 additions & 5 deletions

File tree

driver/src/params.rs

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -40,20 +40,27 @@ fn sql_string_to_json(s: &str) -> serde_json::Value {
4040
if s == "NULL" {
4141
return serde_json::Value::Null;
4242
}
43-
if s == "TRUE" {
43+
// Accept both uppercase (from Param for bool) and lowercase (from serde_json::Value::Bool)
44+
if s.eq_ignore_ascii_case("TRUE") {
4445
return serde_json::Value::Bool(true);
4546
}
46-
if s == "FALSE" {
47+
if s.eq_ignore_ascii_case("FALSE") {
4748
return serde_json::Value::Bool(false);
4849
}
49-
// Try integer
50+
// Try i64 first
5051
if let Ok(n) = s.parse::<i64>() {
5152
return serde_json::json!(n);
5253
}
53-
// Try float
54-
if let Ok(n) = s.parse::<f64>() {
54+
// Try u64 for values above i64::MAX (e.g. large u64/u128 IDs)
55+
if let Ok(n) = s.parse::<u64>() {
5556
return serde_json::json!(n);
5657
}
58+
// Try float (only if not a pure integer string, to avoid precision loss on u128/i128)
59+
if s.contains('.') || s.contains('e') || s.contains('E') {
60+
if let Ok(n) = s.parse::<f64>() {
61+
return serde_json::json!(n);
62+
}
63+
}
5764
// Strip surrounding single quotes for strings
5865
if s.starts_with('\'') && s.ends_with('\'') && s.len() >= 2 {
5966
let inner = &s[1..s.len() - 1];
@@ -452,6 +459,17 @@ mod tests {
452459
let params: Params = (Some(42), None::<()>, Some("world")).into();
453460
let json = params.to_json_value();
454461
assert_eq!(json, serde_json::json!([42, null, "world"]));
462+
463+
// Test lowercase bool (from serde_json::Value::Bool)
464+
let params: Params = serde_json::json!([true, false]).into();
465+
let json = params.to_json_value();
466+
assert_eq!(json, serde_json::json!([true, false]));
467+
468+
// Test large u64 above i64::MAX
469+
let big: u64 = u64::MAX;
470+
let params = Params::QuestionParams(vec![big.to_string()]);
471+
let json = params.to_json_value();
472+
assert_eq!(json, serde_json::json!([big]));
455473
}
456474

457475
#[test]

0 commit comments

Comments
 (0)