@@ -99,6 +99,12 @@ impl FastFieldDecoderValues {
9999 }
100100 }
101101
102+ fn pop_inner_values ( & self , column : & mut ColumnBuilder , size : usize ) {
103+ for _ in 0 ..size {
104+ let _ = column. pop ( ) ;
105+ }
106+ }
107+
102108 pub fn read_field < R : AsRef < [ u8 ] > > (
103109 & self ,
104110 column : & mut ColumnBuilder ,
@@ -285,10 +291,16 @@ impl FastFieldDecoderValues {
285291 break ;
286292 }
287293 if idx != 0 {
288- reader. must_ignore_byte ( b',' ) ?;
294+ if let Err ( err) = reader. must_ignore_byte ( b',' ) {
295+ self . pop_inner_values ( & mut column. builder , idx) ;
296+ return Err ( err. into ( ) ) ;
297+ }
289298 }
290299 let _ = reader. ignore_white_spaces ( ) ;
291- self . read_field ( & mut column. builder , reader, positions) ?;
300+ if let Err ( err) = self . read_field ( & mut column. builder , reader, positions) {
301+ self . pop_inner_values ( & mut column. builder , idx) ;
302+ return Err ( err) ;
303+ }
292304 }
293305 column. commit_row ( ) ;
294306 Ok ( ( ) )
@@ -311,24 +323,41 @@ impl FastFieldDecoderValues {
311323 break ;
312324 }
313325 if idx != 0 {
314- reader. must_ignore_byte ( b',' ) ?;
326+ if let Err ( err) = reader. must_ignore_byte ( b',' ) {
327+ self . pop_inner_values ( & mut map_builder[ KEY ] , idx) ;
328+ self . pop_inner_values ( & mut map_builder[ VALUE ] , idx) ;
329+ return Err ( err. into ( ) ) ;
330+ }
315331 }
316332 let _ = reader. ignore_white_spaces ( ) ;
317- self . read_field ( & mut map_builder[ KEY ] , reader, positions) ?;
333+ if let Err ( err) = self . read_field ( & mut map_builder[ KEY ] , reader, positions) {
334+ self . pop_inner_values ( & mut map_builder[ KEY ] , idx) ;
335+ self . pop_inner_values ( & mut map_builder[ VALUE ] , idx) ;
336+ return Err ( err) ;
337+ }
318338 // check duplicate map keys
319339 let key = map_builder[ KEY ] . pop ( ) . unwrap ( ) ;
320340 if set. contains ( & key) {
321- column. commit_row ( ) ;
341+ self . pop_inner_values ( & mut map_builder[ KEY ] , idx) ;
342+ self . pop_inner_values ( & mut map_builder[ VALUE ] , idx) ;
322343 return Err ( ErrorCode :: BadBytes (
323344 "map keys have to be unique" . to_string ( ) ,
324345 ) ) ;
325346 }
326347 set. insert ( key. clone ( ) ) ;
327348 map_builder[ KEY ] . push ( key. as_ref ( ) ) ;
328349 let _ = reader. ignore_white_spaces ( ) ;
329- reader. must_ignore_byte ( b':' ) ?;
350+ if let Err ( err) = reader. must_ignore_byte ( b':' ) {
351+ self . pop_inner_values ( & mut map_builder[ KEY ] , idx + 1 ) ;
352+ self . pop_inner_values ( & mut map_builder[ VALUE ] , idx) ;
353+ return Err ( err. into ( ) ) ;
354+ }
330355 let _ = reader. ignore_white_spaces ( ) ;
331- self . read_field ( & mut map_builder[ VALUE ] , reader, positions) ?;
356+ if let Err ( err) = self . read_field ( & mut map_builder[ VALUE ] , reader, positions) {
357+ self . pop_inner_values ( & mut map_builder[ KEY ] , idx + 1 ) ;
358+ self . pop_inner_values ( & mut map_builder[ VALUE ] , idx) ;
359+ return Err ( err) ;
360+ }
332361 }
333362 column. commit_row ( ) ;
334363 Ok ( ( ) )
@@ -341,15 +370,30 @@ impl FastFieldDecoderValues {
341370 positions : & mut VecDeque < usize > ,
342371 ) -> Result < ( ) > {
343372 reader. must_ignore_byte ( b'(' ) ?;
344- for ( idx, field ) in fields . iter_mut ( ) . enumerate ( ) {
373+ for idx in 0 ..fields . len ( ) {
345374 let _ = reader. ignore_white_spaces ( ) ;
346375 if idx != 0 {
347- reader. must_ignore_byte ( b',' ) ?;
376+ if let Err ( err) = reader. must_ignore_byte ( b',' ) {
377+ for field in fields. iter_mut ( ) . take ( idx) {
378+ self . pop_inner_values ( field, 1 ) ;
379+ }
380+ return Err ( err. into ( ) ) ;
381+ }
348382 }
349383 let _ = reader. ignore_white_spaces ( ) ;
350- self . read_field ( field, reader, positions) ?;
384+ if let Err ( err) = self . read_field ( & mut fields[ idx] , reader, positions) {
385+ for field in fields. iter_mut ( ) . take ( idx) {
386+ self . pop_inner_values ( field, 1 ) ;
387+ }
388+ return Err ( err) ;
389+ }
390+ }
391+ if let Err ( err) = reader. must_ignore_byte ( b')' ) {
392+ for field in fields. iter_mut ( ) {
393+ self . pop_inner_values ( field, 1 ) ;
394+ }
395+ return Err ( err. into ( ) ) ;
351396 }
352- reader. must_ignore_byte ( b')' ) ?;
353397 Ok ( ( ) )
354398 }
355399
0 commit comments