From 6f2b0d7b8d1d5e8a96fc6104011fdde87ed00dc6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ragnar=20Dahl=C3=A9n?= Date: Fri, 26 Dec 2025 23:02:35 +0100 Subject: [PATCH] fix: Validate SetStatisticsUpdate correctly (fixes #2865) Previously the pydantic @model_validator would fail because it assumed statistics was a model instance. In a "before"" validator that is not the case. Use an "after" validator instead, where we can use instantiated and validated fields. --- pyiceberg/table/update/__init__.py | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/pyiceberg/table/update/__init__.py b/pyiceberg/table/update/__init__.py index a79e2cb468..17f41dc8d2 100644 --- a/pyiceberg/table/update/__init__.py +++ b/pyiceberg/table/update/__init__.py @@ -21,7 +21,7 @@ from abc import ABC, abstractmethod from datetime import datetime from functools import singledispatch -from typing import TYPE_CHECKING, Annotated, Any, Generic, Literal, TypeVar, cast +from typing import TYPE_CHECKING, Annotated, Any, Generic, Literal, TypeVar, cast, Self from pydantic import Field, field_validator, model_serializer, model_validator @@ -179,13 +179,9 @@ class SetStatisticsUpdate(IcebergBaseModel): description="snapshot-id is **DEPRECATED for REMOVAL** since it contains redundant information. Use `statistics.snapshot-id` field instead.", ) - @model_validator(mode="before") - def validate_snapshot_id(cls, data: dict[str, Any]) -> dict[str, Any]: - stats = cast(StatisticsFile, data["statistics"]) - - data["snapshot_id"] = stats.snapshot_id - - return data + @model_validator(mode="after") + def validate_snapshot_id(self) -> Self: + return self.model_copy(update={"snapshot_id": self.statistics.snapshot_id}) class RemoveStatisticsUpdate(IcebergBaseModel):