@@ -441,7 +441,7 @@ def _(update: AddSnapshotUpdate, base_metadata: TableMetadata, context: _TableMe
441441 elif base_metadata .snapshot_by_id (update .snapshot .snapshot_id ) is not None :
442442 raise ValueError (f"Snapshot with id { update .snapshot .snapshot_id } already exists" )
443443 elif (
444- base_metadata .format_version = = 2
444+ base_metadata .format_version > = 2
445445 and update .snapshot .sequence_number is not None
446446 and update .snapshot .sequence_number <= base_metadata .last_sequence_number
447447 and update .snapshot .parent_snapshot_id is not None
@@ -462,20 +462,25 @@ def _(update: AddSnapshotUpdate, base_metadata: TableMetadata, context: _TableMe
462462 f"Cannot add a snapshot with first row id smaller than the table's next-row-id "
463463 f"{ update .snapshot .first_row_id } < { base_metadata .next_row_id } "
464464 )
465+ elif base_metadata .format_version >= 3 and update .snapshot .added_rows is None :
466+ raise ValueError ("Cannot add snapshot without added rows" )
467+ elif base_metadata .format_version >= 3 and base_metadata .next_row_id is None :
468+ raise ValueError ("Cannot add a snapshot when table next-row-id is null" )
469+
470+ metadata_updates : dict [str , Any ] = {
471+ "last_updated_ms" : update .snapshot .timestamp_ms ,
472+ "last_sequence_number" : update .snapshot .sequence_number ,
473+ "snapshots" : base_metadata .snapshots + [update .snapshot ],
474+ }
475+ if base_metadata .format_version >= 3 :
476+ next_row_id = base_metadata .next_row_id
477+ added_rows = update .snapshot .added_rows
478+ if next_row_id is None or added_rows is None :
479+ raise ValueError ("Cannot compute next-row-id for v3 snapshot update" )
480+ metadata_updates ["next_row_id" ] = next_row_id + added_rows
465481
466482 context .add_update (update )
467- return base_metadata .model_copy (
468- update = {
469- "last_updated_ms" : update .snapshot .timestamp_ms ,
470- "last_sequence_number" : update .snapshot .sequence_number ,
471- "snapshots" : base_metadata .snapshots + [update .snapshot ],
472- "next_row_id" : base_metadata .next_row_id + update .snapshot .added_rows
473- if base_metadata .format_version >= 3
474- and base_metadata .next_row_id is not None
475- and update .snapshot .added_rows is not None
476- else None ,
477- }
478- )
483+ return base_metadata .model_copy (update = metadata_updates )
479484
480485
481486@_apply_table_update .register (SetSnapshotRefUpdate )
0 commit comments