@@ -165,11 +165,13 @@ async fn test_rewrite_data_files() {
165
165
166
166
// commit result again
167
167
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 ( )
170
171
. add_data_files ( data_file_rewrite. clone ( ) )
172
+ . unwrap ( )
173
+ . delete_files ( data_file. clone ( ) )
171
174
. unwrap ( ) ;
172
- rewrite_action. delete_files ( data_file. clone ( ) ) . unwrap ( ) ;
173
175
174
176
let tx = rewrite_action. apply ( ) . await . unwrap ( ) ;
175
177
let table = tx. commit ( & rest_catalog) . await . unwrap ( ) ;
@@ -279,9 +281,13 @@ async fn test_multiple_file_rewrite() {
279
281
let data_file2 = data_file_writer. close ( ) . await . unwrap ( ) ;
280
282
281
283
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 ( ) ;
285
291
let tx = rewrite_action. apply ( ) . await . unwrap ( ) ;
286
292
let table = tx. commit ( & rest_catalog) . await . unwrap ( ) ;
287
293
@@ -357,10 +363,98 @@ async fn test_rewrite_nonexistent_file() {
357
363
let nonexistent_data_file = valid_data_file. clone ( ) ;
358
364
359
365
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 ( ) ;
361
367
362
368
// Attempt to delete the nonexistent file
363
369
let result = rewrite_action. delete_files ( nonexistent_data_file) ;
364
370
365
371
assert ! ( result. is_ok( ) ) ;
366
372
}
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