This is an automated email from the ASF dual-hosted git repository.

laskoviymishka pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/iceberg-go.git


The following commit(s) were added to refs/heads/main by this push:
     new 4ede599b3 fix(table): calculate snapshot summary totals as int64 
(#1582)
4ede599b3 is described below

commit 4ede599b3a678ad4f21f117dd387b6b4e9d5ffde
Author: Minh Vu <[email protected]>
AuthorDate: Thu Jul 30 09:58:45 2026 +0200

    fix(table): calculate snapshot summary totals as int64 (#1582)
    
    ## What changed
    
    Calculate snapshot summary totals with `GetInt64` and format them with
    `strconv.FormatInt`.
    
    ## Why
    
    Snapshot totals such as record counts and file sizes were parsed through
    platform-sized `int`. On 32-bit systems, ordinary Iceberg totals above
    `math.MaxInt32` could truncate or wrap.
    
    The regression test adds values above the 32-bit range and verifies
    their exact totals.
    
    ## Testing
    
    - `go test ./table`
    - `go vet ./table`
    
    Signed-off-by: Minh Vu <[email protected]>
---
 table/snapshots.go               |  8 ++++----
 table/snapshots_internal_test.go | 15 +++++++++++++++
 2 files changed, 19 insertions(+), 4 deletions(-)

diff --git a/table/snapshots.go b/table/snapshots.go
index 2de54b6f6..4c3993e58 100644
--- a/table/snapshots.go
+++ b/table/snapshots.go
@@ -530,12 +530,12 @@ func updateSnapshotSummaries(sum Summary, previous 
iceberg.Properties) (Summary,
        }
 
        updateTotals := func(totalProp, addedProp, removedProp string) {
-               newTotal := previous.GetInt(totalProp, 0)
-               newTotal += sum.Properties.GetInt(addedProp, 0)
-               newTotal -= sum.Properties.GetInt(removedProp, 0)
+               newTotal := previous.GetInt64(totalProp, 0)
+               newTotal += sum.Properties.GetInt64(addedProp, 0)
+               newTotal -= sum.Properties.GetInt64(removedProp, 0)
 
                if newTotal >= 0 {
-                       sum.Properties[totalProp] = strconv.Itoa(newTotal)
+                       sum.Properties[totalProp] = strconv.FormatInt(newTotal, 
10)
                }
        }
 
diff --git a/table/snapshots_internal_test.go b/table/snapshots_internal_test.go
index 488287f81..edefaead6 100644
--- a/table/snapshots_internal_test.go
+++ b/table/snapshots_internal_test.go
@@ -217,3 +217,18 @@ func TestUpdateSnapshotSummariesUnsupportedOperation(t 
*testing.T) {
        _, err := updateSnapshotSummaries(Summary{Operation: 
Operation("scan")}, nil)
        assert.ErrorIs(t, err, iceberg.ErrNotImplemented)
 }
+
+func TestUpdateSnapshotSummariesPreservesLargeTotals(t *testing.T) {
+       t.Parallel()
+
+       result, err := updateSnapshotSummaries(Summary{Operation: OpAppend, 
Properties: iceberg.Properties{
+               addedRecordsKey:  "1000000000",
+               addedFileSizeKey: "1000000000",
+       }}, iceberg.Properties{
+               totalRecordsKey:  "3000000000",
+               totalFileSizeKey: "8000000000",
+       })
+       require.NoError(t, err)
+       assert.Equal(t, "4000000000", result.Properties[totalRecordsKey])
+       assert.Equal(t, "9000000000", result.Properties[totalFileSizeKey])
+}

Reply via email to