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

zeroshade 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 0544baaa5 refactor(table)!: rename Metadata.Version to FormatVersion 
(#2317)
0544baaa5 is described below

commit 0544baaa5117e3e7a06d0ba07f1156533e4e76cd
Author: Minh Vu <[email protected]>
AuthorDate: Mon Oct 26 19:28:30 2026 +0100

    refactor(table)!: rename Metadata.Version to FormatVersion (#2317)
    
    * refactor(table)!: rename Metadata.Version to FormatVersion
    
    Signed-off-by: Minh Vu <[email protected]>
    
    * chore: sync release notes with main to resolve conflicts
    
    ---------
    
    Signed-off-by: Minh Vu <[email protected]>
    Co-authored-by: Matt Topol <[email protected]>
---
 catalog/hadoop/hadoop_test.go                     |  2 +-
 catalog/rest/lazy_snapshot_bench_test.go          |  2 +-
 catalog/rest/rest.go                              |  2 +-
 catalog/rest/rest_test.go                         |  8 +++---
 catalog/sql/sql_test.go                           |  2 +-
 cmd/iceberg/info.go                               |  2 +-
 cmd/iceberg/output.go                             |  2 +-
 cmd/iceberg/upgrade_rollback.go                   |  2 +-
 table/arrow_utils.go                              |  2 +-
 table/commit_test.go                              |  2 +-
 table/deferred_snapshots.go                       | 10 +++----
 table/inspect_internal_test.go                    |  4 +--
 table/inspect_position_deletes.go                 |  4 +--
 table/inspect_position_deletes_regression_test.go |  4 +--
 table/metadata.go                                 | 32 +++++++++++++----------
 table/metadata_builder_internal_test.go           | 16 ++++++------
 table/metadata_internal_test.go                   | 14 +++++-----
 table/metadata_preflight_bench_test.go            |  2 +-
 table/position_delta_writer.go                    |  4 +--
 table/replace_files_test.go                       |  2 +-
 table/rewrite_data_files.go                       |  4 +--
 table/row_lineage_rewrite_test.go                 |  2 +-
 table/scanner.go                                  |  2 +-
 table/scanner_internal_test.go                    |  4 +--
 table/table.go                                    |  4 +--
 table/transaction_internal_test.go                |  4 +--
 table/update_spec.go                              |  4 +--
 table/update_spec_test.go                         |  2 +-
 table/write_records.go                            |  2 +-
 29 files changed, 75 insertions(+), 71 deletions(-)

diff --git a/catalog/hadoop/hadoop_test.go b/catalog/hadoop/hadoop_test.go
index d6160ce2f..a4a40eb05 100644
--- a/catalog/hadoop/hadoop_test.go
+++ b/catalog/hadoop/hadoop_test.go
@@ -2422,7 +2422,7 @@ func (s *HadoopCatalogTestSuite) 
TestCreateTableMetadataFormatVersion() {
        s.Require().NoError(err)
 
        // Default format version should be V2
-       s.Equal(2, tbl.Metadata().Version())
+       s.Equal(2, tbl.Metadata().FormatVersion())
 }
 
 // CommitTable tests
diff --git a/catalog/rest/lazy_snapshot_bench_test.go 
b/catalog/rest/lazy_snapshot_bench_test.go
index a815c81ea..b63cd6a8c 100644
--- a/catalog/rest/lazy_snapshot_bench_test.go
+++ b/catalog/rest/lazy_snapshot_bench_test.go
@@ -226,7 +226,7 @@ func BenchmarkStageParseBuilderMutation(b *testing.B) {
                                                        added.SnapshotID = n
                                                        added.ParentSnapshotID 
= &current.SnapshotID
                                                        added.TimestampMs = 
current.TimestampMs + 1
-                                                       if meta.Version() > 1 {
+                                                       if meta.FormatVersion() 
> 1 {
                                                                
added.SequenceNumber = meta.LastSequenceNumber() + 1
                                                        }
                                                        if err := 
builder.AddSnapshot(&added); err != nil {
diff --git a/catalog/rest/rest.go b/catalog/rest/rest.go
index a2ef852c4..c6d61c7a3 100644
--- a/catalog/rest/rest.go
+++ b/catalog/rest/rest.go
@@ -1740,7 +1740,7 @@ func (r *Catalog) commitStagedCreate(ctx context.Context, 
identifier table.Ident
        updates := make([]table.Update, 0, len(stagedUpdates)+10)
        updates = append(updates,
                table.NewAssignUUIDUpdate(meta.TableUUID()),
-               table.NewUpgradeFormatVersionUpdate(meta.Version()),
+               table.NewUpgradeFormatVersionUpdate(meta.FormatVersion()),
                table.NewAddSchemaUpdate(meta.CurrentSchema()),
                table.NewSetCurrentSchemaUpdate(-1),
        )
diff --git a/catalog/rest/rest_test.go b/catalog/rest/rest_test.go
index 8c36e52a4..ef4901c58 100644
--- a/catalog/rest/rest_test.go
+++ b/catalog/rest/rest_test.go
@@ -1450,7 +1450,7 @@ func (r *RestCatalogSuite) TestCreateTable200() {
 
        r.Equal(catalog.ToIdentifier("fokko", "fokko2"), tbl.Identifier())
        r.Equal("s3://warehouse/database/table/metadata.json", 
tbl.MetadataLocation())
-       r.EqualValues(1, tbl.Metadata().Version())
+       r.EqualValues(1, tbl.Metadata().FormatVersion())
        r.Equal("bf289591-dcc0-4234-ad4f-5c3eed811a29", 
tbl.Metadata().TableUUID().String())
        r.EqualValues(1657810967051, tbl.Metadata().LastUpdatedMillis())
        r.Equal(3, tbl.Metadata().LastColumnID())
@@ -1687,7 +1687,7 @@ func (r *RestCatalogSuite) TestLoadTable200() {
 
        r.Equal(catalog.ToIdentifier("fokko", "table"), tbl.Identifier())
        
r.Equal("s3://warehouse/database/table/metadata/00001-5f2f8166-244c-4eae-ac36-384ecdec81fc.gz.metadata.json",
 tbl.MetadataLocation())
-       r.EqualValues(1, tbl.Metadata().Version())
+       r.EqualValues(1, tbl.Metadata().FormatVersion())
        r.Equal("b55d9dda-6561-423a-8bfc-787980ce421f", 
tbl.Metadata().TableUUID().String())
        r.EqualValues(1646787054459, tbl.Metadata().LastUpdatedMillis())
        r.Equal(2, tbl.Metadata().LastColumnID())
@@ -2292,7 +2292,7 @@ func (r *RestCatalogSuite) TestRenameTable204() {
 
        r.Equal(catalog.ToIdentifier("fokko", "destination"), 
renamedTable.Identifier())
        r.Equal("s3://warehouse/database/table/metadata.json", 
renamedTable.MetadataLocation())
-       r.EqualValues(1, renamedTable.Metadata().Version())
+       r.EqualValues(1, renamedTable.Metadata().FormatVersion())
        r.Equal("bf289591-dcc0-4234-ad4f-5c3eed811a29", 
renamedTable.Metadata().TableUUID().String())
        r.EqualValues(1657810967051, 
renamedTable.Metadata().LastUpdatedMillis())
        r.Equal(3, renamedTable.Metadata().LastColumnID())
@@ -2528,7 +2528,7 @@ func (r *RestCatalogSuite) TestRegisterTable200() {
 
        r.Equal(catalog.ToIdentifier("fokko", "fokko2"), tbl.Identifier())
        
r.Equal("s3://warehouse/database/table/metadata/00001-5f2f8166-244c-4eae-ac36-384ecdec81fc.gz.metadata.json",
 tbl.MetadataLocation())
-       r.EqualValues(1, tbl.Metadata().Version())
+       r.EqualValues(1, tbl.Metadata().FormatVersion())
        r.Equal("d55d9dda-6561-423a-8bfc-787980ce421f", 
tbl.Metadata().TableUUID().String())
        r.Equal("bryan", tbl.Metadata().Properties()["owner"])
 }
diff --git a/catalog/sql/sql_test.go b/catalog/sql/sql_test.go
index 7a88b76b0..838d6d75a 100644
--- a/catalog/sql/sql_test.go
+++ b/catalog/sql/sql_test.go
@@ -994,7 +994,7 @@ func (s *SqliteCatalogTestSuite) TestCreateV1Table() {
 
                s.FileExists(strings.TrimPrefix(tbl.MetadataLocation(), 
"file://"))
                s.Equal(0, tbl.SortOrder().OrderID())
-               s.Equal(1, tbl.Metadata().Version())
+               s.Equal(1, tbl.Metadata().FormatVersion())
                s.True(tbl.Spec().Equals(*iceberg.UnpartitionedSpec))
                s.NoError(tt.cat.DropTable(context.Background(), tt.tblID))
        }
diff --git a/cmd/iceberg/info.go b/cmd/iceberg/info.go
index c28b94aba..9afbac61c 100644
--- a/cmd/iceberg/info.go
+++ b/cmd/iceberg/info.go
@@ -99,7 +99,7 @@ func buildTableInfo(tbl *table.Table) TableInfo {
        return TableInfo{
                Table:             tableIDString(tbl),
                UUID:              meta.TableUUID().String(),
-               FormatVersion:     meta.Version(),
+               FormatVersion:     meta.FormatVersion(),
                Location:          meta.Location(),
                LastUpdated:       lastUpdated,
                CurrentSnapshotID: currentSnapshotID,
diff --git a/cmd/iceberg/output.go b/cmd/iceberg/output.go
index c69239b49..33956efea 100644
--- a/cmd/iceberg/output.go
+++ b/cmd/iceberg/output.go
@@ -108,7 +108,7 @@ func (t textOutput) DescribeTable(tbl *table.Table) {
 
        pterm.DefaultTable.
                WithData(pterm.TableData{
-                       {"Table format version", 
strconv.Itoa(tbl.Metadata().Version())},
+                       {"Table format version", 
strconv.Itoa(tbl.Metadata().FormatVersion())},
                        {"Metadata location", tbl.MetadataLocation()},
                        {"Table UUID", tbl.Metadata().TableUUID().String()},
                        {"Last updated", 
strconv.Itoa(int(tbl.Metadata().LastUpdatedMillis()))},
diff --git a/cmd/iceberg/upgrade_rollback.go b/cmd/iceberg/upgrade_rollback.go
index 1d89abcc3..ecd194e88 100644
--- a/cmd/iceberg/upgrade_rollback.go
+++ b/cmd/iceberg/upgrade_rollback.go
@@ -34,7 +34,7 @@ import (
 func runUpgrade(ctx context.Context, output Output, cat catalog.Catalog, cmd 
*UpgradeCmd) {
        tbl := loadTable(ctx, output, cat, cmd.TableID)
        meta := tbl.Metadata()
-       currentVersion := meta.Version()
+       currentVersion := meta.FormatVersion()
 
        result := UpgradeResult{
                DryRun:          cmd.DryRun,
diff --git a/table/arrow_utils.go b/table/arrow_utils.go
index 0c4752667..b76cbd017 100644
--- a/table/arrow_utils.go
+++ b/table/arrow_utils.go
@@ -2220,7 +2220,7 @@ func positionDeleteRecordsToDataFiles(ctx 
context.Context, rootLocation string,
        // does not expose a property to opt out. The DV path threads each data
        // file's spec id and partition record through DVWriter so partitioned
        // outputs carry the correct manifest-entry partition.
-       if latestMetadata.Version() >= 3 {
+       if latestMetadata.FormatVersion() >= 3 {
                return positionDeleteRecordsToDataFilesDV(ctx, rootLocation, 
args, latestMetadata, partitionContextByFilePath)
        }
 
diff --git a/table/commit_test.go b/table/commit_test.go
index 1ff846c0c..2f539fbcf 100644
--- a/table/commit_test.go
+++ b/table/commit_test.go
@@ -154,7 +154,7 @@ func newV1CommitTestTable(t *testing.T) *table.Table {
 
 func TestUpgradeFormatVersionV1ToV2(t *testing.T) {
        tbl := newV1CommitTestTable(t)
-       assert.Equal(t, 1, tbl.Metadata().Version())
+       assert.Equal(t, 1, tbl.Metadata().FormatVersion())
 
        tx := tbl.NewTransaction()
        require.NoError(t, tx.UpgradeFormatVersion(2))
diff --git a/table/deferred_snapshots.go b/table/deferred_snapshots.go
index 2e7245357..d3f5faa97 100644
--- a/table/deferred_snapshots.go
+++ b/table/deferred_snapshots.go
@@ -464,9 +464,9 @@ func 
parseNormalizedMetadataBytesDeferredSnapshots(normalized []byte, formatVers
 
                return nil, fmt.Errorf("%w: %w", ErrInvalidMetadata, err)
        }
-       if metadata.Version() != formatVersion {
+       if metadata.FormatVersion() != formatVersion {
                return nil, fmt.Errorf("%w: preflight selected version %d, 
decoded version %d",
-                       ErrInvalidMetadataFormatVersion, formatVersion, 
metadata.Version())
+                       ErrInvalidMetadataFormatVersion, formatVersion, 
metadata.FormatVersion())
        }
 
        common := commonMetadataOf(metadata)
@@ -548,7 +548,7 @@ func finishDeferredMetadataUnmarshal(metadata Metadata) 
error {
 }
 
 func prepareDeferredSnapshots(rawSnapshots json.RawMessage, common 
*commonMetadata, metadata Metadata) (*deferredSnapshotState, []Snapshot, error) 
{
-       if metadata.Version() > 1 {
+       if metadata.FormatVersion() > 1 {
                if err := requireLastSequenceNumber(metadata); err != nil {
                        return nil, nil, err
                }
@@ -602,11 +602,11 @@ func prepareDeferredSnapshots(rawSnapshots 
json.RawMessage, common *commonMetada
                if err := fields.validateHeavyFields(); err != nil {
                        return nil, nil, fmt.Errorf("%w: snapshot %d: %w", 
ErrInvalidMetadata, *fields.SnapshotID, err)
                }
-               if metadata.Version() > 1 && fields.SequenceNumber > 
metadata.LastSequenceNumber() {
+               if metadata.FormatVersion() > 1 && fields.SequenceNumber > 
metadata.LastSequenceNumber() {
                        return nil, nil, fmt.Errorf("%w: snapshot %d has 
sequence number %d which is greater than last-sequence-number %d",
                                ErrInvalidMetadata, *fields.SnapshotID, 
fields.SequenceNumber, metadata.LastSequenceNumber())
                }
-               if metadata.Version() >= 3 && fields.FirstRowID != nil && 
*fields.FirstRowID < 0 {
+               if metadata.FormatVersion() >= 3 && fields.FirstRowID != nil && 
*fields.FirstRowID < 0 {
                        return nil, nil, fmt.Errorf("%w: snapshot %d has 
invalid first-row-id %d",
                                ErrInvalidMetadata, *fields.SnapshotID, 
*fields.FirstRowID)
                }
diff --git a/table/inspect_internal_test.go b/table/inspect_internal_test.go
index 004eb924b..3da07bd0e 100644
--- a/table/inspect_internal_test.go
+++ b/table/inspect_internal_test.go
@@ -4101,11 +4101,11 @@ func TestInspectPositionDeletesEarlyRelease(t 
*testing.T) {
                        } else {
                                partitionType, partitionIDs, partitionErr := 
positionDeletesPartitionType(tbl.metadata)
                                require.NoError(t, partitionErr)
-                               schema := 
PositionDeletesSchema(tbl.metadata.CurrentSchema(), partitionType, 
tbl.metadata.Version())
+                               schema := 
PositionDeletesSchema(tbl.metadata.CurrentSchema(), partitionType, 
tbl.metadata.FormatVersion())
                                arrowSchema, schemaErr := 
SchemaToArrowSchema(schema, nil, true, false)
                                require.NoError(t, schemaErr)
                                rr = inspect.positionDeleteRecordReader(
-                                       context.Background(), arrowSchema, nil, 
slices.Values([]iceberg.ManifestFile(nil)), partitionType, partitionIDs, 
tbl.metadata.Version())
+                                       context.Background(), arrowSchema, nil, 
slices.Values([]iceberg.ManifestFile(nil)), partitionType, partitionIDs, 
tbl.metadata.FormatVersion())
                        }
                        require.NoError(t, err)
                        require.True(t, rr.Next())
diff --git a/table/inspect_position_deletes.go 
b/table/inspect_position_deletes.go
index a4f55ba4e..1758e8619 100644
--- a/table/inspect_position_deletes.go
+++ b/table/inspect_position_deletes.go
@@ -54,7 +54,7 @@ func (i InspectTable) PositionDeletes(ctx context.Context) 
(array.RecordReader,
        if err != nil {
                return nil, fmt.Errorf("inspect position deletes: %w", err)
        }
-       schema := PositionDeletesSchema(i.tbl.Metadata().CurrentSchema(), 
partitionType, i.tbl.Metadata().Version())
+       schema := PositionDeletesSchema(i.tbl.Metadata().CurrentSchema(), 
partitionType, i.tbl.Metadata().FormatVersion())
        arrowSchema, err := SchemaToArrowSchema(schema, nil, true, false)
        if err != nil {
                return nil, fmt.Errorf("inspect position deletes: build arrow 
schema: %w", err)
@@ -67,7 +67,7 @@ func (i InspectTable) PositionDeletes(ctx context.Context) 
(array.RecordReader,
        ctx = compute.WithAllocator(ctx, i.alloc)
 
        return i.positionDeleteRecordReader(
-               ctx, arrowSchema, fs, manifests, partitionType, partitionIDs, 
i.tbl.Metadata().Version()), nil
+               ctx, arrowSchema, fs, manifests, partitionType, partitionIDs, 
i.tbl.Metadata().FormatVersion()), nil
 }
 
 func (i InspectTable) currentPositionDeleteManifests(
diff --git a/table/inspect_position_deletes_regression_test.go 
b/table/inspect_position_deletes_regression_test.go
index 605198895..1411990fb 100644
--- a/table/inspect_position_deletes_regression_test.go
+++ b/table/inspect_position_deletes_regression_test.go
@@ -249,7 +249,7 @@ func 
TestPositionDeletesPartitionTypeAvoidsCurrentSchemaFieldIDs(t *testing.T) {
        require.Equal(t, map[int]int{1000: 3}, partitionIDs)
        require.Equal(t, 3, partitionType.FieldList[0].ID)
        require.NotPanics(t, func() {
-               _ = PositionDeletesSchema(currentSchema, partitionType, 
metadata.Version())
+               _ = PositionDeletesSchema(currentSchema, partitionType, 
metadata.FormatVersion())
        })
 }
 
@@ -321,6 +321,6 @@ func 
TestPositionDeletesPartitionTypeFallsBackWhenFieldIDsReachLimit(t *testing.
                require.LessOrEqual(t, field.ID, math.MaxInt32)
        }
        require.NotPanics(t, func() {
-               _ = PositionDeletesSchema(currentSchema, partitionType, 
metadata.Version())
+               _ = PositionDeletesSchema(currentSchema, partitionType, 
metadata.FormatVersion())
        })
 }
diff --git a/table/metadata.go b/table/metadata.go
index 251588a6c..b2911a95b 100644
--- a/table/metadata.go
+++ b/table/metadata.go
@@ -312,8 +312,8 @@ func partitionSpecIndexPosition(index 
*partitionSpecIndexData, specs []iceberg.P
 //
 // https://iceberg.apache.org/spec/#iceberg-table-spec
 type Metadata interface {
-       // Version indicates the version of this metadata, 1 for V1, 2 for V2, 
etc.
-       Version() int
+       // FormatVersion returns the Iceberg table format version (1, 2, 3, 
etc.).
+       FormatVersion() int
        // TableUUID returns a UUID that identifies the table, generated when 
the
        // table is created. Implementations must throw an exception if a 
table's
        // UUID does not match the expected UUID after refreshing metadata.
@@ -496,7 +496,7 @@ func MetadataBuilderFromBase(metadata Metadata, 
currentFileLocation string) (*Me
        b := &MetadataBuilder{}
        b.base = metadata
 
-       b.formatVersion = metadata.Version()
+       b.formatVersion = metadata.FormatVersion()
        b.uuid = metadata.TableUUID()
        b.loc = metadata.Location()
        b.lastUpdatedMS = 0
@@ -540,11 +540,11 @@ func MetadataBuilderFromBase(metadata Metadata, 
currentFileLocation string) (*Me
                        b.encryptionKeyList = 
cloneEncryptionKeys(common.EncryptionKeyList)
                }
                b.snapshotIndex = buildSnapshotIndex(b.snapshotList)
-               if metadata.Version() > 1 {
+               if metadata.FormatVersion() > 1 {
                        seq := metadata.LastSequenceNumber()
                        b.lastSequenceNumber = &seq
                }
-               if metadata.Version() >= 3 {
+               if metadata.FormatVersion() >= 3 {
                        nextRowID := metadata.NextRowID()
                        b.nextRowID = &nextRowID
                }
@@ -568,11 +568,11 @@ func MetadataBuilderFromBase(metadata Metadata, 
currentFileLocation string) (*Me
                b.snapshotIndex = buildSnapshotIndex(b.snapshotList)
                b.sortOrderList = slices.Clone(metadata.SortOrders())
                b.defaultSortOrderID = metadata.DefaultSortOrder()
-               if metadata.Version() > 1 {
+               if metadata.FormatVersion() > 1 {
                        seq := metadata.LastSequenceNumber()
                        b.lastSequenceNumber = &seq
                }
-               if metadata.Version() >= 3 {
+               if metadata.FormatVersion() >= 3 {
                        nextRowID := metadata.NextRowID()
                        b.nextRowID = &nextRowID
                }
@@ -2169,9 +2169,9 @@ func ParseMetadataBytes(b []byte) (Metadata, error) {
 
                return nil, fmt.Errorf("%w: %w", ErrInvalidMetadata, err)
        }
-       if ret.Version() != formatVersion {
+       if ret.FormatVersion() != formatVersion {
                return nil, fmt.Errorf("%w: preflight selected version %d, 
decoded version %d",
-                       ErrInvalidMetadataFormatVersion, formatVersion, 
ret.Version())
+                       ErrInvalidMetadataFormatVersion, formatVersion, 
ret.FormatVersion())
        }
 
        return ret, nil
@@ -3124,8 +3124,6 @@ func (c *commonMetadata) NameMapping() 
iceberg.NameMapping {
        return nil
 }
 
-func (c *commonMetadata) Version() int { return c.FormatVersion }
-
 func (c *commonMetadata) checkMainRefMatchesCurrentSnapshot() error {
        if c.CurrentSnapshotID != nil {
                if ref, ok := c.SnapshotRefs[MainBranch]; ok {
@@ -3205,6 +3203,8 @@ func initMetadataV1Deser() *metadataV1 {
        return &meta
 }
 
+func (m *metadataV1) FormatVersion() int { return 
m.commonMetadata.FormatVersion }
+
 func (m *metadataV1) LastSequenceNumber() int64 { return 0 }
 func (m *metadataV1) NextRowID() int64          { return 0 } // V1 doesn't 
support row lineage
 
@@ -3276,7 +3276,7 @@ func (m *metadataV1) UnmarshalJSON(b []byte) error {
 
 func (m *metadataV1) finishUnmarshal() error {
        if err := rejectFieldsBeyondVersion(
-               m.FormatVersion,
+               m.commonMetadata.FormatVersion,
                versionScopedField{name: "last-sequence-number", introduced: 2, 
present: m.commonMetadata.LastSequenceNumber != nil},
                versionScopedField{name: "next-row-id", introduced: 3, present: 
m.commonMetadata.NextRowID != nil},
                versionScopedField{name: "encryption-keys", introduced: 3, 
present: len(m.EncryptionKeyList) > 0},
@@ -3350,6 +3350,8 @@ func initMetadataV2Deser() *metadataV2 {
        }
 }
 
+func (m *metadataV2) FormatVersion() int { return 
m.commonMetadata.FormatVersion }
+
 func (m *metadataV2) LastSequenceNumber() int64 { return m.LastSeqNum }
 func (m *metadataV2) NextRowID() int64          { return 0 } // V2 doesn't 
support row lineage
 
@@ -3386,7 +3388,7 @@ func (m *metadataV2) UnmarshalJSON(b []byte) error {
 
 func (m *metadataV2) finishUnmarshal() error {
        if err := rejectFieldsBeyondVersion(
-               m.FormatVersion,
+               m.commonMetadata.FormatVersion,
                versionScopedField{name: "next-row-id", introduced: 3, present: 
m.commonMetadata.NextRowID != nil},
                versionScopedField{name: "encryption-keys", introduced: 3, 
present: len(m.EncryptionKeyList) > 0},
        ); err != nil {
@@ -3450,6 +3452,8 @@ func initMetadataV3Deser() *metadataV3 {
        }
 }
 
+func (m *metadataV3) FormatVersion() int { return 
m.commonMetadata.FormatVersion }
+
 func (m *metadataV3) LastSequenceNumber() int64 { return m.LastSeqNum }
 func (m *metadataV3) NextRowID() int64 {
        if m.NextRowIDValue == -1 {
@@ -3492,7 +3496,7 @@ func (m *metadataV3) UnmarshalJSON(b []byte) error {
 }
 
 func (m *metadataV3) finishUnmarshal() error {
-       if err := rejectFieldsBeyondVersion(m.FormatVersion); err != nil {
+       if err := rejectFieldsBeyondVersion(m.commonMetadata.FormatVersion); 
err != nil {
                return err
        }
 
diff --git a/table/metadata_builder_internal_test.go 
b/table/metadata_builder_internal_test.go
index b32eb7a97..6f2464dcb 100644
--- a/table/metadata_builder_internal_test.go
+++ b/table/metadata_builder_internal_test.go
@@ -174,7 +174,7 @@ func TestBuildUnpartitionedUnsorted(t *testing.T) {
        require.NoError(t, err)
        require.NotNil(t, meta)
 
-       require.Equal(t, 2, meta.Version())
+       require.Equal(t, 2, meta.FormatVersion())
        require.Equal(t, TestLocation, meta.Location())
        require.Equal(t, 0, meta.CurrentSchema().ID)
        require.Equal(t, 0, meta.DefaultPartitionSpec())
@@ -3632,7 +3632,7 @@ func 
TestSetFormatVersionV1ToV2InitializesSequenceNumber(t *testing.T) {
 
        meta, err := builder.Build()
        require.NoError(t, err)
-       require.Equal(t, 2, meta.Version())
+       require.Equal(t, 2, meta.FormatVersion())
        require.Equal(t, int64(0), meta.LastSequenceNumber())
 }
 
@@ -3642,7 +3642,7 @@ func 
TestSetFormatVersionV1ToV3InitializesSequenceNumberAndNextRowID(t *testing.
 
        meta, err := builder.Build()
        require.NoError(t, err)
-       require.Equal(t, 3, meta.Version())
+       require.Equal(t, 3, meta.FormatVersion())
        require.Equal(t, int64(0), meta.LastSequenceNumber())
        require.Equal(t, int64(0), meta.NextRowID())
 }
@@ -3653,7 +3653,7 @@ func TestSetFormatVersionV2ToV3InitializesNextRowID(t 
*testing.T) {
 
        meta, err := builder.Build()
        require.NoError(t, err)
-       require.Equal(t, 3, meta.Version())
+       require.Equal(t, 3, meta.FormatVersion())
        require.Equal(t, int64(0), meta.NextRowID())
 }
 
@@ -3768,7 +3768,7 @@ func TestSetFormatVersionV2ToV3PreservesSequenceNumber(t 
*testing.T) {
 func TestSetFormatVersionV1ToV3FromDeserializedMetadata(t *testing.T) {
        meta, err := ParseMetadataString(ExampleTableMetadataV1)
        require.NoError(t, err)
-       require.Equal(t, 1, meta.Version())
+       require.Equal(t, 1, meta.FormatVersion())
 
        builder, err := MetadataBuilderFromBase(meta, "")
        require.NoError(t, err)
@@ -3776,7 +3776,7 @@ func TestSetFormatVersionV1ToV3FromDeserializedMetadata(t 
*testing.T) {
 
        meta3, err := builder.Build()
        require.NoError(t, err)
-       require.Equal(t, 3, meta3.Version())
+       require.Equal(t, 3, meta3.FormatVersion())
        require.Equal(t, int64(0), meta3.LastSequenceNumber())
        require.Equal(t, int64(0), meta3.NextRowID())
        require.NotEqual(t, uuid.UUID{}, meta3.TableUUID())
@@ -3785,7 +3785,7 @@ func TestSetFormatVersionV1ToV3FromDeserializedMetadata(t 
*testing.T) {
 func TestSetFormatVersionV2ToV3FromDeserializedMetadata(t *testing.T) {
        meta, err := ParseMetadataString(ExampleTableMetadataV2)
        require.NoError(t, err)
-       require.Equal(t, 2, meta.Version())
+       require.Equal(t, 2, meta.FormatVersion())
 
        builder, err := MetadataBuilderFromBase(meta, "")
        require.NoError(t, err)
@@ -3793,7 +3793,7 @@ func TestSetFormatVersionV2ToV3FromDeserializedMetadata(t 
*testing.T) {
 
        meta3, err := builder.Build()
        require.NoError(t, err)
-       require.Equal(t, 3, meta3.Version())
+       require.Equal(t, 3, meta3.FormatVersion())
        require.Equal(t, int64(34), meta3.LastSequenceNumber())
        require.Equal(t, int64(0), meta3.NextRowID())
 }
diff --git a/table/metadata_internal_test.go b/table/metadata_internal_test.go
index f0950b5ae..522dd0eb6 100644
--- a/table/metadata_internal_test.go
+++ b/table/metadata_internal_test.go
@@ -205,7 +205,7 @@ func TestMetadataV1Parsing(t *testing.T) {
        require.NotNil(t, meta)
 
        assert.IsType(t, (*metadataV1)(nil), meta)
-       assert.Equal(t, 1, meta.Version())
+       assert.Equal(t, 1, meta.FormatVersion())
 
        data := meta.(*metadataV1)
        assert.Equal(t, uuid.MustParse("d20125c8-7284-442c-9aea-15fee620737c"), 
meta.TableUUID())
@@ -253,7 +253,7 @@ func TestMetadataV2Parsing(t *testing.T) {
        require.NotNil(t, meta)
 
        assert.IsType(t, (*metadataV2)(nil), meta)
-       assert.Equal(t, 2, meta.Version())
+       assert.Equal(t, 2, meta.FormatVersion())
 
        data := meta.(*metadataV2)
        assert.Equal(t, uuid.MustParse("9c12d441-03fe-4693-9a96-a0705ddf69c1"), 
data.UUID)
@@ -285,7 +285,7 @@ func TestMetadataV3Parsing(t *testing.T) {
        require.NotNil(t, meta)
 
        assert.IsType(t, (*metadataV3)(nil), meta)
-       assert.Equal(t, 3, meta.Version())
+       assert.Equal(t, 3, meta.FormatVersion())
 
        data := meta.(*metadataV3)
        assert.Equal(t, uuid.MustParse("9c12d441-03fe-4693-9a96-a0705ddf69c1"), 
data.UUID)
@@ -751,7 +751,7 @@ func TestMetadataV3Builder(t *testing.T) {
        metadata, err := builder.Build()
        require.NoError(t, err)
 
-       assert.Equal(t, 3, metadata.Version())
+       assert.Equal(t, 3, metadata.FormatVersion())
        assert.Equal(t, int64(0), metadata.NextRowID())
 }
 
@@ -2094,7 +2094,7 @@ func TestTableMetadataV1PartitionSpecsWithoutDefaultId(t 
*testing.T) {
        // Deserialize the JSON - this should succeed by inferring 
default_spec_id as the max spec ID
        meta, err := 
getTestTableMetadata("TableMetadataV1PartitionSpecsWithoutDefaultId.json")
        require.NoError(t, err)
-       require.Equal(t, meta.Version(), 1)
+       require.Equal(t, meta.FormatVersion(), 1)
        require.Equal(t, meta.TableUUID(), 
uuid.MustParse("d20125c8-7284-442c-9aea-15fee620737c"))
        require.Equal(t, meta.DefaultPartitionSpec(), 2)
        require.Equal(t, len(meta.PartitionSpecs()), 2)
@@ -2133,7 +2133,7 @@ func TestDefaultPartitionSpec(t *testing.T) {
 func TestTableMetadataV1SchemasWithoutCurrentId(t *testing.T) {
        meta, err := 
getTestTableMetadata("TableMetadataV1SchemasWithoutCurrentId.json")
        require.NoError(t, err)
-       require.Equal(t, meta.(*metadataV1).Version(), 1)
+       require.Equal(t, meta.(*metadataV1).FormatVersion(), 1)
        require.Equal(t, meta.TableUUID(), 
uuid.MustParse("d20125c8-7284-442c-9aea-15fee620737c"))
        schema := meta.CurrentSchema()
        require.Equal(t, len(schema.Fields()), 3)
@@ -2727,7 +2727,7 @@ func TestV3PartitionStatisticsRoundTrip(t *testing.T) {
 
        meta, err := ParseMetadataBytes(raw)
        require.NoError(t, err)
-       require.Equal(t, 3, meta.Version())
+       require.Equal(t, 3, meta.FormatVersion())
 
        partStats := slices.Collect(meta.PartitionStatistics())
        require.Len(t, partStats, 2)
diff --git a/table/metadata_preflight_bench_test.go 
b/table/metadata_preflight_bench_test.go
index 53c736c33..d064237be 100644
--- a/table/metadata_preflight_bench_test.go
+++ b/table/metadata_preflight_bench_test.go
@@ -52,7 +52,7 @@ func BenchmarkParseMetadataBytes(b *testing.B) {
                                if err != nil {
                                        b.Fatal(err)
                                }
-                               metadataParseBenchmarkSink = metadata.Version()
+                               metadataParseBenchmarkSink = 
metadata.FormatVersion()
                        }
                })
        }
diff --git a/table/position_delta_writer.go b/table/position_delta_writer.go
index 02f646c6c..3cde88782 100644
--- a/table/position_delta_writer.go
+++ b/table/position_delta_writer.go
@@ -91,9 +91,9 @@ func NewPositionDeltaWriter(tbl *Table, opts 
...WriteRecordOption) (*PositionDel
                return nil, fmt.Errorf("%w: table is nil", 
iceberg.ErrInvalidArgument)
        }
 
-       if tbl.metadata.Version() < 3 {
+       if tbl.metadata.FormatVersion() < 3 {
                return nil, fmt.Errorf("%w: PositionDeltaWriter requires format 
version >= 3, got %d",
-                       iceberg.ErrInvalidArgument, tbl.metadata.Version())
+                       iceberg.ErrInvalidArgument, 
tbl.metadata.FormatVersion())
        }
 
        return &PositionDeltaWriter{
diff --git a/table/replace_files_test.go b/table/replace_files_test.go
index 172de05ad..2a2bf491c 100644
--- a/table/replace_files_test.go
+++ b/table/replace_files_test.go
@@ -1099,7 +1099,7 @@ func newCompactedDataFile(t *testing.T, tbl *table.Table, 
path string, recordCou
                path, iceberg.ParquetFile, nil, nil, nil, recordCount, 512,
        )
        require.NoError(t, err)
-       if tbl.Metadata().Version() >= 3 {
+       if tbl.Metadata().FormatVersion() >= 3 {
                builder.FirstRowID(tbl.Metadata().NextRowID())
        }
 
diff --git a/table/rewrite_data_files.go b/table/rewrite_data_files.go
index d198b4bea..a9ca91016 100644
--- a/table/rewrite_data_files.go
+++ b/table/rewrite_data_files.go
@@ -476,10 +476,10 @@ func ExecuteCompactionGroup(ctx context.Context, tbl 
*Table, group CompactionTas
        // the first v3 manifest-list write after a v1/v2->v3 upgrade, so mixed
        // groups are expected during migration; for now we degrade gracefully
        // and do not preserve lineage for the surviving rows.
-       preserveLineage := tbl.metadata.Version() >= 3 && 
allTasksHaveRowLineage(group.Tasks)
+       preserveLineage := tbl.metadata.FormatVersion() >= 3 && 
allTasksHaveRowLineage(group.Tasks)
        if preserveLineage {
                scanOpts = append(scanOpts, WithRowLineage())
-       } else if tbl.metadata.Version() >= 3 {
+       } else if tbl.metadata.FormatVersion() >= 3 {
                // Drop lineage for the whole mixed group. Warn only when at 
least one
                // source file already carried lineage; all-legacy groups fall 
through
                // silently because there is no lineage to lose.
diff --git a/table/row_lineage_rewrite_test.go 
b/table/row_lineage_rewrite_test.go
index d6f7e5ae2..72bd0eecd 100644
--- a/table/row_lineage_rewrite_test.go
+++ b/table/row_lineage_rewrite_test.go
@@ -478,7 +478,7 @@ func 
TestExecuteCompactionGroupPreservesRowIDAcrossV2Upgrade(t *testing.T) {
        require.NoError(t, tx.UpgradeFormatVersion(3))
        tbl, err = tx.Commit(ctx)
        require.NoError(t, err)
-       require.Equal(t, 3, tbl.Metadata().Version())
+       require.Equal(t, 3, tbl.Metadata().FormatVersion())
 
        v3Data, err := array.TableFromJSON(mem, arrowSchema, []string{
                `[{"id": 3, "data": "c"}, {"id": 4, "data": "d"}]`,
diff --git a/table/scanner.go b/table/scanner.go
index 99a639e66..5194ecf2b 100644
--- a/table/scanner.go
+++ b/table/scanner.go
@@ -718,7 +718,7 @@ func (scan *Scan) Projection() (*iceberg.Schema, error) {
        if err != nil {
                return nil, err
        }
-       curVersion := scan.metadata.Version()
+       curVersion := scan.metadata.FormatVersion()
 
        if scan.includeRowLineage && curVersion < minFormatVersionRowLineage {
                return nil, fmt.Errorf("%w: row lineage requires format version 
%d, table is v%d",
diff --git a/table/scanner_internal_test.go b/table/scanner_internal_test.go
index 808a80aa9..d07c3008a 100644
--- a/table/scanner_internal_test.go
+++ b/table/scanner_internal_test.go
@@ -2122,7 +2122,7 @@ func TestProjectionV3SelectRowLineageColumns(t 
*testing.T) {
                iceberg.Properties{"format-version": "3"},
        )
        require.NoError(t, err)
-       assert.Equal(t, 3, metadata.Version(), "sanity: must be v3")
+       assert.Equal(t, 3, metadata.FormatVersion(), "sanity: must be v3")
 
        scan := &Scan{
                metadata:       metadata,
@@ -2263,7 +2263,7 @@ func TestProjectionV3SchemaAlreadyHasRowID(t *testing.T) {
 
        metadata, err := ParseMetadataString(metadataJSON)
        require.NoError(t, err)
-       assert.Equal(t, 3, metadata.Version(), "sanity: must be v3")
+       assert.Equal(t, 3, metadata.FormatVersion(), "sanity: must be v3")
 
        scan := &Scan{
                metadata:          metadata,
diff --git a/table/table.go b/table/table.go
index 5ffb5eabe..75d7d36cd 100644
--- a/table/table.go
+++ b/table/table.go
@@ -973,11 +973,11 @@ func stagedSnapshotStillValid(snap *Snapshot, fresh 
Metadata) bool {
                return true
        }
 
-       if fresh.Version() >= 2 && snap.SequenceNumber <= 
fresh.LastSequenceNumber() {
+       if fresh.FormatVersion() >= 2 && snap.SequenceNumber <= 
fresh.LastSequenceNumber() {
                return false
        }
 
-       if fresh.Version() >= 3 && (snap.FirstRowID == nil || *snap.FirstRowID 
< fresh.NextRowID()) {
+       if fresh.FormatVersion() >= 3 && (snap.FirstRowID == nil || 
*snap.FirstRowID < fresh.NextRowID()) {
                return false
        }
 
diff --git a/table/transaction_internal_test.go 
b/table/transaction_internal_test.go
index 587f3caf4..ecc074488 100644
--- a/table/transaction_internal_test.go
+++ b/table/transaction_internal_test.go
@@ -1268,7 +1268,7 @@ func 
TestTransactionApplyKeepsMetadataUnchangedOnUpdateFailure(t *testing.T) {
        require.NoError(t, err)
 
        updates := []Update{
-               NewUpgradeFormatVersionUpdate(baseMeta.Version() + 1),
+               NewUpgradeFormatVersionUpdate(baseMeta.FormatVersion() + 1),
                NewSetCurrentSchemaUpdate(9999),
        }
 
@@ -1303,7 +1303,7 @@ func 
TestTransactionApplyKeepsRequirementsUnchangedOnUpdateFailure(t *testing.T)
        // the requirement list at their pre-call state — not the one extra req 
this
        // call would add, and not an empty list.
        updates := []Update{
-               NewUpgradeFormatVersionUpdate(baseMeta.Version() + 1),
+               NewUpgradeFormatVersionUpdate(baseMeta.FormatVersion() + 1),
                NewSetCurrentSchemaUpdate(9999),
        }
        err = txn.apply(updates, []Requirement{AssertCurrentSchemaID(0)})
diff --git a/table/update_spec.go b/table/update_spec.go
index 678a77f92..25976e2cc 100644
--- a/table/update_spec.go
+++ b/table/update_spec.go
@@ -223,7 +223,7 @@ func (us *UpdateSpec) Apply() (iceberg.PartitionSpec, 
error) {
                                return iceberg.PartitionSpec{}, err
                        }
                        partitionFields = append(partitionFields, newField)
-               } else if us.meta.Version() == 1 {
+               } else if us.meta.FormatVersion() == 1 {
                        if rename, renamed := us.renames[field.Name]; renamed {
                                newField, err = us.addNewField(us.schema, 
field.FirstSourceID(), field.FieldID, rename, iceberg.VoidTransform{}, 
partitionNames)
                        } else {
@@ -467,7 +467,7 @@ func (us *UpdateSpec) partitionField(key transformKey, name 
string) (iceberg.Par
        // Reuse applies to format v2+ (v1 has no permanent field-ID contract) 
and
        // resurrects fields removed in an earlier committed update; same-update
        // remove/re-add is handled ahead of this call by 
rewriteDeleteAndAddField.
-       if us.meta.Version() >= 2 {
+       if us.meta.FormatVersion() >= 2 {
                // PartitionSpecs() is ordered by ascending spec ID, so the 
cached slice
                // keeps the lowest-spec-ID match first when a field was 
renamed across
                // specs. The match's own name is returned, which for the 
no-name case may
diff --git a/table/update_spec_test.go b/table/update_spec_test.go
index 65bae0be4..8eb4738b3 100644
--- a/table/update_spec_test.go
+++ b/table/update_spec_test.go
@@ -197,7 +197,7 @@ func 
TestUpdateSpecReplacesTimeTransformOverV1VoidTombstone(t *testing.T) {
        meta, err := table.NewMetadata(testSchema, &baseSpec, 
table.UnsortedSortOrder, "",
                iceberg.Properties{"format-version": "1"})
        require.NoError(t, err)
-       require.Equal(t, 1, meta.Version())
+       require.Equal(t, 1, meta.FormatVersion())
        tbl := table.New([]string{"v1_year_partitioned"}, meta, "", nil, nil)
 
        specUpdate := table.NewUpdateSpec(tbl.NewTransaction(), false).
diff --git a/table/write_records.go b/table/write_records.go
index c50360fee..1712dddf2 100644
--- a/table/write_records.go
+++ b/table/write_records.go
@@ -171,7 +171,7 @@ func WriteRecords(ctx context.Context, tbl *Table,
        }
 
        if cfg.preserveRowLineage {
-               if v := tbl.metadata.Version(); v < 3 {
+               if v := tbl.metadata.FormatVersion(); v < 3 {
                        return internal.SingleErrorIter[iceberg.DataFile](
                                fmt.Errorf("WithPreserveRowLineage requires a 
v3+ table, got v%d", v))
                }

Reply via email to