@@ -165,11 +165,13 @@ async fn test_rewrite_data_files() {
165165
166166 // commit result again
167167 let tx = Transaction :: new ( & table) ;
168- let mut rewrite_action = tx. rewrite_files ( None , vec ! [ ] ) . unwrap ( ) ;
169- rewrite_action
168+ let rewrite_action = tx
169+ . rewrite_files ( None , vec ! [ ] )
170+ . unwrap ( )
170171 . add_data_files ( data_file_rewrite. clone ( ) )
172+ . unwrap ( )
173+ . delete_files ( data_file. clone ( ) )
171174 . unwrap ( ) ;
172- rewrite_action. delete_files ( data_file. clone ( ) ) . unwrap ( ) ;
173175
174176 let tx = rewrite_action. apply ( ) . await . unwrap ( ) ;
175177 let table = tx. commit ( & rest_catalog) . await . unwrap ( ) ;
@@ -279,9 +281,13 @@ async fn test_multiple_file_rewrite() {
279281 let data_file2 = data_file_writer. close ( ) . await . unwrap ( ) ;
280282
281283 let tx = Transaction :: new ( & table) ;
282- let mut rewrite_action = tx. rewrite_files ( None , vec ! [ ] ) . unwrap ( ) ;
283- rewrite_action. add_data_files ( data_file1. clone ( ) ) . unwrap ( ) ;
284- rewrite_action. add_data_files ( data_file2. clone ( ) ) . unwrap ( ) ;
284+ let rewrite_action = tx
285+ . rewrite_files ( None , vec ! [ ] )
286+ . unwrap ( )
287+ . add_data_files ( data_file1. clone ( ) )
288+ . unwrap ( )
289+ . add_data_files ( data_file2. clone ( ) )
290+ . unwrap ( ) ;
285291 let tx = rewrite_action. apply ( ) . await . unwrap ( ) ;
286292 let table = tx. commit ( & rest_catalog) . await . unwrap ( ) ;
287293
@@ -357,10 +363,98 @@ async fn test_rewrite_nonexistent_file() {
357363 let nonexistent_data_file = valid_data_file. clone ( ) ;
358364
359365 let tx = Transaction :: new ( & table) ;
360- let mut rewrite_action = tx. rewrite_files ( None , vec ! [ ] ) . unwrap ( ) ;
366+ let rewrite_action = tx. rewrite_files ( None , vec ! [ ] ) . unwrap ( ) ;
361367
362368 // Attempt to delete the nonexistent file
363369 let result = rewrite_action. delete_files ( nonexistent_data_file) ;
364370
365371 assert ! ( result. is_ok( ) ) ;
366372}
373+
374+ #[ tokio:: test]
375+ async fn test_sequence_number_in_manifest_entry ( ) {
376+ let fixture = get_shared_containers ( ) ;
377+ let rest_catalog = RestCatalog :: new ( fixture. catalog_config . clone ( ) ) ;
378+ let ns = random_ns ( ) . await ;
379+ let schema = test_schema ( ) ;
380+
381+ let table_creation = TableCreation :: builder ( )
382+ . name ( "t3" . to_string ( ) )
383+ . schema ( schema. clone ( ) )
384+ . build ( ) ;
385+
386+ let table = rest_catalog
387+ . create_table ( ns. name ( ) , table_creation)
388+ . await
389+ . unwrap ( ) ;
390+
391+ let schema: Arc < arrow_schema:: Schema > = Arc :: new (
392+ table
393+ . metadata ( )
394+ . current_schema ( )
395+ . as_ref ( )
396+ . try_into ( )
397+ . unwrap ( ) ,
398+ ) ;
399+ let location_generator = DefaultLocationGenerator :: new ( table. metadata ( ) . clone ( ) ) . unwrap ( ) ;
400+ let file_name_generator = DefaultFileNameGenerator :: new (
401+ "test" . to_string ( ) ,
402+ None ,
403+ iceberg:: spec:: DataFileFormat :: Parquet ,
404+ ) ;
405+ let parquet_writer_builder = ParquetWriterBuilder :: new (
406+ WriterProperties :: default ( ) ,
407+ table. metadata ( ) . current_schema ( ) . clone ( ) ,
408+ table. file_io ( ) . clone ( ) ,
409+ location_generator. clone ( ) ,
410+ file_name_generator. clone ( ) ,
411+ ) ;
412+ let data_file_writer_builder = DataFileWriterBuilder :: new ( parquet_writer_builder, None , 0 ) ;
413+ let mut data_file_writer = data_file_writer_builder. clone ( ) . build ( ) . await . unwrap ( ) ;
414+ let col1 = StringArray :: from ( vec ! [ Some ( "foo" ) , Some ( "bar" ) , None , Some ( "baz" ) ] ) ;
415+ let col2 = Int32Array :: from ( vec ! [ Some ( 1 ) , Some ( 2 ) , Some ( 3 ) , Some ( 4 ) ] ) ;
416+ let col3 = BooleanArray :: from ( vec ! [ Some ( true ) , Some ( false ) , None , Some ( false ) ] ) ;
417+ let batch = RecordBatch :: try_new ( schema. clone ( ) , vec ! [
418+ Arc :: new( col1) as ArrayRef ,
419+ Arc :: new( col2) as ArrayRef ,
420+ Arc :: new( col3) as ArrayRef ,
421+ ] )
422+ . unwrap ( ) ;
423+ data_file_writer. write ( batch. clone ( ) ) . await . unwrap ( ) ;
424+ let data_file1 = data_file_writer. close ( ) . await . unwrap ( ) ;
425+
426+ let mut data_file_writer = data_file_writer_builder. clone ( ) . build ( ) . await . unwrap ( ) ;
427+ data_file_writer. write ( batch. clone ( ) ) . await . unwrap ( ) ;
428+ let data_file2 = data_file_writer. close ( ) . await . unwrap ( ) ;
429+
430+ // Commit with sequence number
431+
432+ let tx = Transaction :: new ( & table) ;
433+ let rewrite_action = tx
434+ . rewrite_files ( None , vec ! [ ] )
435+ . unwrap ( )
436+ . add_data_files ( data_file1. clone ( ) )
437+ . unwrap ( )
438+ . add_data_files ( data_file2. clone ( ) )
439+ . unwrap ( ) ;
440+ // Set sequence number to 12345
441+ let rewrite_action = rewrite_action. new_data_file_sequence_number ( 12345 ) . unwrap ( ) ;
442+ let tx = rewrite_action. apply ( ) . await . unwrap ( ) ;
443+ let table = tx. commit ( & rest_catalog) . await . unwrap ( ) ;
444+
445+ // Verify manifest entry has correct sequence number
446+ let snapshot = table. metadata ( ) . current_snapshot ( ) . unwrap ( ) ;
447+ let manifest_list = snapshot
448+ . load_manifest_list ( table. file_io ( ) , table. metadata ( ) )
449+ . await
450+ . unwrap ( ) ;
451+
452+ assert_eq ! ( manifest_list. entries( ) . len( ) , 1 ) ;
453+
454+ for manifest_file in manifest_list. entries ( ) {
455+ let manifest = manifest_file. load_manifest ( table. file_io ( ) ) . await . unwrap ( ) ;
456+ for entry in manifest. entries ( ) {
457+ assert_eq ! ( entry. sequence_number( ) , Some ( 12345 ) ) ;
458+ }
459+ }
460+ }
0 commit comments