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
= ¤t.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))
}