@@ -197,18 +197,27 @@ fn escape_dataframe(input: DataFrame) -> DeltaResult<DataFrame> {
197197 let mut df = input. clone ( ) ;
198198 let schema = input. schema ( ) ;
199199 for field in schema. fields ( ) {
200+ for dt in [ & DataType :: LargeUtf8 , & DataType :: Utf8 , & DataType :: Utf8View ] {
201+ if field. data_type ( ) == dt {
202+ df = df. with_column (
203+ field. name ( ) ,
204+ replace ( col ( field. name ( ) ) , lit ( "\n " ) , lit ( "\\ n" ) ) ,
205+ ) ?;
206+
207+ if std:: env:: var ( "CSV_ESCAPE_FORWARD_SLASH" ) . is_ok ( ) {
208+ df = df. with_column (
209+ field. name ( ) ,
210+ replace ( col ( field. name ( ) ) , lit ( "\\ " ) , lit ( "\\ \\ " ) ) ,
211+ ) ?;
212+ }
213+ }
214+ }
200215 if field. data_type ( ) == & DataType :: Boolean && std:: env:: var ( "CSV_BOOL_AS_INT" ) . is_ok ( ) {
201216 if std:: env:: var ( "CSV_BOOL_NULL_AS_INT" ) . is_ok ( ) {
202217 df = df. fill_null ( ScalarValue :: from ( 0 ) , [ field. name ( ) . clone ( ) ] . to_vec ( ) ) ?;
203218 }
204219 df = df. with_column ( field. name ( ) , cast ( col ( field. name ( ) ) , DataType :: Int32 ) ) ?;
205220 }
206- if field. data_type ( ) == & DataType :: Utf8 || field. data_type ( ) == & DataType :: LargeUtf8 {
207- df = df. with_column (
208- field. name ( ) ,
209- replace ( col ( field. name ( ) ) , lit ( "\n " ) , lit ( "\\ n" ) ) ,
210- ) ?;
211- }
212221 }
213222 Ok ( df)
214223}
@@ -358,7 +367,7 @@ mod tests {
358367 let mut insert_found = false ;
359368 let mut delete_found = false ;
360369 while let Some ( Ok ( entry) ) = stream. next ( ) . await {
361- println ! ( " entry: {entry:?}" ) ;
370+ dbg ! ( & entry) ;
362371 if entry. location . prefix_matches ( & Path :: from ( "deletes" ) ) {
363372 delete_found = true ;
364373 }
@@ -457,6 +466,9 @@ mod tests {
457466 #[ tokio:: test]
458467 #[ serial]
459468 async fn test_writing_with_newlines ( ) -> DeltaResult < ( ) > {
469+ unsafe {
470+ std:: env:: set_var ( "CSV_ESCAPE_FORWARD_SLASH" , "1" ) ;
471+ }
460472 let ctx = SessionContext :: new ( ) ;
461473 let temp = tempfile:: tempdir ( ) ?;
462474 let tempfile = temp. path ( ) . join ( "some.csv" ) ;
@@ -487,10 +499,19 @@ mod tests {
487499 lines. len( ) ,
488500 "Should have only written four lines for the sample input data"
489501 ) ;
502+ assert_eq ! (
503+ lines[ 3 ] . as_ref( ) . expect( "Failure" ) ,
504+ r#""","209","149",":-\\","1.0""# ,
505+ "The CSV output was not what we expected"
506+ ) ;
490507
491508 let df = ctx. read_csv ( tempfile, CsvReadOptions :: default ( ) ) . await ?;
492509 assert_eq ! ( written_schema. as_arrow( ) , df. schema( ) . as_arrow( ) ) ;
493510
511+ unsafe {
512+ std:: env:: remove_var ( "CSV_ESCAPE_FORWARD_SLASH" ) ;
513+ }
514+
494515 Ok ( ( ) )
495516 }
496517}
0 commit comments