Skip to content

Commit c784683

Browse files
authored
fix: csv empty cell should be parsed to null (risingwavelabs#8709)
1 parent 359fbf5 commit c784683

File tree

1 file changed

+17
-4
lines changed

1 file changed

+17
-4
lines changed

src/connector/src/parser/csv_parser.rs

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -126,10 +126,11 @@ impl CsvParser {
126126
}
127127
writer.insert(|desc| {
128128
if let Some(i) = headers.iter().position(|name| name == &desc.name) {
129-
Self::parse_string(
130-
&desc.data_type,
131-
fields.get_mut(i).map(std::mem::take).unwrap_or_default(),
132-
)
129+
let value = fields.get_mut(i).map(std::mem::take).unwrap_or_default();
130+
if value.is_empty() {
131+
return Ok(None);
132+
}
133+
Self::parse_string(&desc.data_type, value)
133134
} else {
134135
Ok(None)
135136
}
@@ -138,6 +139,9 @@ impl CsvParser {
138139
fields.reverse();
139140
writer.insert(|desc| {
140141
if let Some(value) = fields.pop() {
142+
if value.is_empty() {
143+
return Ok(None);
144+
}
141145
Self::parse_string(&desc.data_type, value)
142146
} else {
143147
Ok(None)
@@ -162,6 +166,7 @@ mod tests {
162166
r#""15541","a,1,1,",4"#,
163167
r#"0,"""0",0"#,
164168
r#"0,0,0,0,0,0,0,0,0,0,0,0,0,"#,
169+
r#",,,,"#,
165170
];
166171
let descs = vec![
167172
SourceColumnDesc::simple("a", DataType::Int32, 0.into()),
@@ -252,6 +257,14 @@ mod tests {
252257
(Some(ScalarImpl::Int32(0)))
253258
);
254259
}
260+
261+
{
262+
let (op, row) = rows.next().unwrap();
263+
assert_eq!(op, Op::Insert);
264+
assert_eq!(row.datum_at(0), None);
265+
assert_eq!(row.datum_at(1), None);
266+
assert_eq!(row.datum_at(2), None);
267+
}
255268
}
256269
#[tokio::test]
257270
async fn test_csv_with_headers() {

0 commit comments

Comments
 (0)