@@ -1449,7 +1449,6 @@ impl DeltaDataChecker {
14491449 break ;
14501450 }
14511451 }
1452-
14531452 let sql = format ! (
14541453 "SELECT {} FROM `{table_name}` WHERE NOT ({}) LIMIT 1" ,
14551454 field_to_select, expression
@@ -2248,6 +2247,58 @@ mod tests {
22482247 assert ! ( result. is_err( ) ) ;
22492248 }
22502249
2250+ /// Ensure that constraints when there are spaces in the field name still work
2251+ ///
2252+ /// See <https://github.com/delta-io/delta-rs/pull/3374>
2253+ #[ tokio:: test]
2254+ async fn test_constraints_with_spacey_fields ( ) -> DeltaResult < ( ) > {
2255+ let schema = Arc :: new ( Schema :: new ( vec ! [
2256+ Field :: new( "a" , ArrowDataType :: Utf8 , false ) ,
2257+ Field :: new( "b bop" , ArrowDataType :: Int32 , false ) ,
2258+ ] ) ) ;
2259+ let batch = RecordBatch :: try_new (
2260+ Arc :: clone ( & schema) ,
2261+ vec ! [
2262+ Arc :: new( arrow:: array:: StringArray :: from( vec![
2263+ "a" , "b bop" , "c" , "d" ,
2264+ ] ) ) ,
2265+ Arc :: new( arrow:: array:: Int32Array :: from( vec![ 1 , 10 , 10 , 100 ] ) ) ,
2266+ ] ,
2267+ ) ?;
2268+
2269+ // Valid invariants return Ok(())
2270+ let constraints = vec ! [
2271+ Constraint :: new( "custom a" , "a is not null" ) ,
2272+ Constraint :: new( "custom_b" , "b bop < 1000" ) ,
2273+ ] ;
2274+ assert ! ( DeltaDataChecker :: new_with_constraints( constraints)
2275+ . check_batch( & batch)
2276+ . await
2277+ . is_ok( ) ) ;
2278+
2279+ // Violated invariants returns an error with list of violations
2280+ let constraints = vec ! [
2281+ Constraint :: new( "custom_a" , "a is null" ) ,
2282+ Constraint :: new( "custom_B" , "b bop < 100" ) ,
2283+ ] ;
2284+ let result = DeltaDataChecker :: new_with_constraints ( constraints)
2285+ . check_batch ( & batch)
2286+ . await ;
2287+ assert ! ( result. is_err( ) ) ;
2288+ assert ! ( matches!( result, Err ( DeltaTableError :: InvalidData { .. } ) ) ) ;
2289+ if let Err ( DeltaTableError :: InvalidData { violations } ) = result {
2290+ assert_eq ! ( violations. len( ) , 2 ) ;
2291+ }
2292+
2293+ // Irrelevant constraints return a different error
2294+ let constraints = vec ! [ Constraint :: new( "custom_c" , "c > 2000" ) ] ;
2295+ let result = DeltaDataChecker :: new_with_constraints ( constraints)
2296+ . check_batch ( & batch)
2297+ . await ;
2298+ assert ! ( result. is_err( ) ) ;
2299+ Ok ( ( ) )
2300+ }
2301+
22512302 #[ test]
22522303 fn roundtrip_test_delta_exec_plan ( ) {
22532304 let ctx = SessionContext :: new ( ) ;
0 commit comments