diff --git a/rust/arrow/src/csv/reader.rs b/rust/arrow/src/csv/reader.rs index fc0692268ae..e38926d37fe 100644 --- a/rust/arrow/src/csv/reader.rs +++ b/rust/arrow/src/csv/reader.rs @@ -446,6 +446,7 @@ fn parse( arrays.and_then(|arr| RecordBatch::try_new(projected_schema, arr)) } +/// Specialized parsing implementations trait Parser: ArrowPrimitiveType { fn parse(string: &str) -> Option { string.parse::().ok() @@ -454,13 +455,13 @@ trait Parser: ArrowPrimitiveType { impl Parser for BooleanType { fn parse(string: &str) -> Option { - if string == "false" || string == "FALSE" || string == "False" { - return Some(true); + if string.eq_ignore_ascii_case("false") { + Some(false) + } else if string.eq_ignore_ascii_case("true") { + Some(true) + } else { + None } - if string == "true" || string == "TRUE" || string == "True" { - return Some(false); - } - None } } @@ -1037,4 +1038,43 @@ mod tests { assert!(csv.next().is_none()); Ok(()) } + + #[test] + fn test_parsing_bool() { + // Encode the expected behavior of boolean parsing + assert_eq!(Some(true), parse_item::("true")); + assert_eq!(Some(true), parse_item::("tRUe")); + assert_eq!(Some(true), parse_item::("True")); + assert_eq!(Some(true), parse_item::("TRUE")); + assert_eq!(None, parse_item::("t")); + assert_eq!(None, parse_item::("T")); + assert_eq!(None, parse_item::("")); + + assert_eq!(Some(false), parse_item::("false")); + assert_eq!(Some(false), parse_item::("fALse")); + assert_eq!(Some(false), parse_item::("False")); + assert_eq!(Some(false), parse_item::("FALSE")); + assert_eq!(None, parse_item::("f")); + assert_eq!(None, parse_item::("F")); + assert_eq!(None, parse_item::("")); + } + + #[test] + fn test_parsing_float() { + assert_eq!(Some(12.34), parse_item::("12.34")); + assert_eq!(Some(-12.34), parse_item::("-12.34")); + assert_eq!(Some(12.0), parse_item::("12")); + assert_eq!(Some(0.0), parse_item::("0")); + assert!(parse_item::("nan").unwrap().is_nan()); + assert!(parse_item::("NaN").unwrap().is_nan()); + assert!(parse_item::("inf").unwrap().is_infinite()); + assert!(parse_item::("inf").unwrap().is_sign_positive()); + assert!(parse_item::("-inf").unwrap().is_infinite()); + assert!(parse_item::("-inf") + .unwrap() + .is_sign_negative()); + assert_eq!(None, parse_item::("")); + assert_eq!(None, parse_item::("dd")); + assert_eq!(None, parse_item::("12.34.56")); + } }