@@ -88,12 +88,111 @@ pub const SQL_GET_DATA_FILES_ADDED_BETWEEN_SNAPSHOTS: &str = "
8888 ORDER BY data.begin_snapshot" ;
8989
9090pub const SQL_GET_DELETE_FILES_ADDED_BETWEEN_SNAPSHOTS : & str = "
91- SELECT del.begin_snapshot
92- FROM ducklake_delete_file AS del
93- WHERE del.table_id = ?
94- AND del.begin_snapshot > ?
95- AND del.begin_snapshot <= ?
96- ORDER BY del.begin_snapshot" ;
91+ WITH params AS (
92+ SELECT
93+ ? AS table_identifier,
94+ ? AS start_snapshot,
95+ ? AS finish_snapshot
96+ ),
97+
98+ current_delete AS (
99+ SELECT
100+ df.data_file_id,
101+ df.begin_snapshot,
102+ df.path,
103+ df.path_is_relative,
104+ df.file_size_bytes,
105+ df.footer_size,
106+ df.encryption_key
107+ FROM ducklake_delete_file df
108+ CROSS JOIN params p
109+ WHERE df.table_id = p.table_identifier
110+ AND df.begin_snapshot BETWEEN p.start_snapshot AND p.finish_snapshot
111+ ),
112+
113+ all_deletes AS (
114+ SELECT
115+ df.data_file_id,
116+ df.begin_snapshot,
117+ df.path,
118+ df.path_is_relative,
119+ df.file_size_bytes,
120+ df.footer_size,
121+ df.encryption_key
122+ FROM ducklake_delete_file df
123+ CROSS JOIN params p
124+ WHERE df.table_id = p.table_identifier
125+ )
126+
127+ SELECT
128+ data.path,
129+ data.path_is_relative,
130+ data.file_size_bytes,
131+ data.footer_size,
132+ data.row_id_start,
133+ data.record_count,
134+ data.mapping_id,
135+
136+ cd.path AS current_delete_path,
137+ cd.path_is_relative AS current_delete_path_is_relative,
138+ cd.file_size_bytes AS current_delete_file_size_bytes,
139+ cd.footer_size AS current_delete_footer_size,
140+
141+ pd.path AS previous_delete_path,
142+ pd.path_is_relative AS previous_delete_path_is_relative,
143+ pd.file_size_bytes AS previous_delete_file_size_bytes,
144+ pd.footer_size AS previous_delete_footer_size,
145+
146+ cd.begin_snapshot
147+ FROM current_delete cd
148+ JOIN ducklake_data_file data
149+ ON data.data_file_id = cd.data_file_id
150+ LEFT JOIN LATERAL (
151+ SELECT path, path_is_relative, file_size_bytes, footer_size
152+ FROM all_deletes ad
153+ WHERE ad.data_file_id = cd.data_file_id
154+ AND ad.begin_snapshot < cd.begin_snapshot
155+ ORDER BY ad.begin_snapshot DESC
156+ LIMIT 1
157+ ) pd ON true
158+ CROSS JOIN params p
159+ WHERE data.table_id = p.table_identifier
160+
161+ UNION ALL
162+
163+ SELECT
164+ data.path,
165+ data.path_is_relative,
166+ data.file_size_bytes,
167+ data.footer_size,
168+ data.row_id_start,
169+ data.record_count,
170+ data.mapping_id,
171+
172+ NULL,
173+ NULL,
174+ NULL,
175+ NULL,
176+
177+ pd.path,
178+ pd.path_is_relative,
179+ pd.file_size_bytes,
180+ pd.footer_size,
181+
182+ data.end_snapshot
183+ FROM ducklake_data_file data
184+ LEFT JOIN LATERAL (
185+ SELECT path, path_is_relative, file_size_bytes, footer_size
186+ FROM all_deletes ad
187+ WHERE ad.data_file_id = data.data_file_id
188+ AND ad.begin_snapshot < data.end_snapshot
189+ ORDER BY ad.begin_snapshot DESC
190+ LIMIT 1
191+ ) pd ON true
192+ CROSS JOIN params p
193+ WHERE data.table_id = p.table_identifier
194+ AND data.end_snapshot BETWEEN p.start_snapshot AND p.finish_snapshot;
195+ " ;
97196
98197// Bulk queries for information_schema (avoids N+1 query problem)
99198
@@ -325,7 +424,29 @@ pub struct DataFileChange {
325424
326425#[ derive( Debug , Clone ) ]
327426pub struct DeleteFileChange {
328- pub begin_snapshot : i64 ,
427+ /* -------- Data file being affected -------- */
428+ pub data_file_path : String ,
429+ pub data_file_path_is_relative : bool ,
430+ pub data_file_size_bytes : i64 ,
431+ pub data_file_footer_size : i64 ,
432+ pub data_row_id_start : i64 ,
433+ pub data_record_count : i64 ,
434+ pub data_mapping_id : Option < i64 > ,
435+
436+ /* -------- Delete file added at this snapshot (None for full file deletes) -------- */
437+ pub current_delete_path : Option < String > ,
438+ pub current_delete_path_is_relative : Option < bool > ,
439+ pub current_delete_file_size_bytes : Option < i64 > ,
440+ pub current_delete_footer_size : Option < i64 > ,
441+
442+ /* -------- Delete file replaced (if any) -------- */
443+ pub previous_delete_path : Option < String > ,
444+ pub previous_delete_path_is_relative : Option < bool > ,
445+ pub previous_delete_file_size_bytes : Option < i64 > ,
446+ pub previous_delete_footer_size : Option < i64 > ,
447+
448+ /* -------- Snapshot where change occurred -------- */
449+ pub snapshot_id : i64 ,
329450}
330451
331452pub trait MetadataProvider : Send + Sync + std:: fmt:: Debug {
0 commit comments