@@ -529,14 +529,112 @@ impl MetadataProvider for MySqlMetadataProvider {
529529 end_snapshot : i64 ,
530530 ) -> Result < Vec < DeleteFileChange > > {
531531 block_on ( async {
532+ // MySQL equivalent of DuckDB's SQL_GET_DELETE_FILES_ADDED_BETWEEN_SNAPSHOTS
533+ // Uses LATERAL (supported in MySQL 8.0.14+) for previous delete file lookup
532534 let rows = sqlx:: query (
533- "SELECT del.begin_snapshot
534- FROM ducklake_delete_file AS del
535- WHERE del.table_id = ?
536- AND del.begin_snapshot > ?
537- AND del.begin_snapshot <= ?
538- ORDER BY del.begin_snapshot" ,
535+ r#"
536+ WITH current_delete AS (
537+ SELECT
538+ ddf.data_file_id,
539+ ddf.begin_snapshot,
540+ ddf.path,
541+ ddf.path_is_relative,
542+ ddf.file_size_bytes,
543+ ddf.footer_size,
544+ ddf.encryption_key
545+ FROM ducklake_delete_file ddf
546+ WHERE ddf.table_id = ?
547+ AND ddf.begin_snapshot > ?
548+ AND ddf.begin_snapshot <= ?
549+ ),
550+
551+ data_files AS (
552+ SELECT df.*
553+ FROM ducklake_data_file df
554+ WHERE df.table_id = ?
555+ )
556+
557+ -- Part 1: Incremental deletes
558+ SELECT
559+ data.path,
560+ data.path_is_relative,
561+ data.file_size_bytes,
562+ data.footer_size,
563+ data.row_id_start,
564+ data.record_count,
565+ data.mapping_id,
566+ current_delete.path,
567+ current_delete.path_is_relative,
568+ current_delete.file_size_bytes,
569+ current_delete.footer_size,
570+ prev.path,
571+ prev.path_is_relative,
572+ prev.file_size_bytes,
573+ prev.footer_size,
574+ current_delete.begin_snapshot
575+ FROM current_delete
576+ JOIN data_files data USING (data_file_id)
577+ LEFT JOIN LATERAL (
578+ SELECT
579+ ddf.path,
580+ ddf.path_is_relative,
581+ ddf.file_size_bytes,
582+ ddf.footer_size
583+ FROM ducklake_delete_file ddf
584+ WHERE ddf.table_id = ?
585+ AND ddf.data_file_id = current_delete.data_file_id
586+ AND ddf.begin_snapshot < current_delete.begin_snapshot
587+ ORDER BY ddf.begin_snapshot DESC
588+ LIMIT 1
589+ ) prev ON true
590+
591+ UNION ALL
592+
593+ -- Part 2: Full file deletes
594+ SELECT
595+ data.path,
596+ data.path_is_relative,
597+ data.file_size_bytes,
598+ data.footer_size,
599+ data.row_id_start,
600+ data.record_count,
601+ data.mapping_id,
602+ NULL,
603+ NULL,
604+ NULL,
605+ NULL,
606+ prev.path,
607+ prev.path_is_relative,
608+ prev.file_size_bytes,
609+ prev.footer_size,
610+ data.end_snapshot
611+ FROM ducklake_data_file data
612+ LEFT JOIN LATERAL (
613+ SELECT
614+ ddf.path,
615+ ddf.path_is_relative,
616+ ddf.file_size_bytes,
617+ ddf.footer_size
618+ FROM ducklake_delete_file ddf
619+ WHERE ddf.table_id = ?
620+ AND ddf.data_file_id = data.data_file_id
621+ AND ddf.begin_snapshot < data.end_snapshot
622+ ORDER BY ddf.begin_snapshot DESC
623+ LIMIT 1
624+ ) prev ON true
625+ WHERE data.table_id = ?
626+ AND data.end_snapshot > ?
627+ AND data.end_snapshot <= ?
628+ "# ,
539629 )
630+ // Part 1 bindings: table_id (current_delete), start_snapshot, end_snapshot, table_id (data_files), table_id (prev lateral)
631+ . bind ( table_id)
632+ . bind ( start_snapshot)
633+ . bind ( end_snapshot)
634+ . bind ( table_id)
635+ . bind ( table_id)
636+ // Part 2 bindings: table_id (prev lateral), table_id (data), start_snapshot, end_snapshot
637+ . bind ( table_id)
540638 . bind ( table_id)
541639 . bind ( start_snapshot)
542640 . bind ( end_snapshot)
@@ -546,7 +644,29 @@ impl MetadataProvider for MySqlMetadataProvider {
546644 rows. into_iter ( )
547645 . map ( |row| {
548646 Ok ( DeleteFileChange {
549- begin_snapshot : row. try_get ( 0 ) ?,
647+ // data file
648+ data_file_path : row. try_get ( 0 ) ?,
649+ data_file_path_is_relative : row. try_get ( 1 ) ?,
650+ data_file_size_bytes : row. try_get ( 2 ) ?,
651+ data_file_footer_size : row. try_get ( 3 ) ?,
652+ data_row_id_start : row. try_get ( 4 ) ?,
653+ data_record_count : row. try_get ( 5 ) ?,
654+ data_mapping_id : row. try_get ( 6 ) ?,
655+
656+ // current delete
657+ current_delete_path : row. try_get ( 7 ) ?,
658+ current_delete_path_is_relative : row. try_get ( 8 ) ?,
659+ current_delete_file_size_bytes : row. try_get ( 9 ) ?,
660+ current_delete_footer_size : row. try_get ( 10 ) ?,
661+
662+ // previous delete
663+ previous_delete_path : row. try_get ( 11 ) ?,
664+ previous_delete_path_is_relative : row. try_get ( 12 ) ?,
665+ previous_delete_file_size_bytes : row. try_get ( 13 ) ?,
666+ previous_delete_footer_size : row. try_get ( 14 ) ?,
667+
668+ // snapshot
669+ snapshot_id : row. try_get ( 15 ) ?,
550670 } )
551671 } )
552672 . collect ( )
0 commit comments