Skip to content

fix(analyzer, iceberg): Read a time travel query with the schema recorded on its snapshot - #28503

Open
yingsu00 wants to merge 2 commits into
prestodb:masterfrom
yingsu00:iceberg-schema-bug-fix
Open

yingsu00 wants to merge 2 commits into
prestodb:masterfrom
yingsu00:iceberg-schema-bug-fix

Conversation

@yingsu00

@yingsu00 yingsu00 commented Sep 17, 2026

Copy link
Copy Markdown
Contributor

Description

This PR contains two commits:

  1. Set IcebergTableHandle.isSnapshotSpecified for a read that picked a snapshot with a version expression, not only for the "t@123" table-name form.
  2. Resolve the columns of a time travel read from the schema recorded on the snapshot it reads, instead of the table's current schema.

Resolves #23553

Motivation and Context

This fix is a pre-requisite of the upcoming plan cache for Iceberg.

Iceberg keeps data history and schema apart. A snapshot is a set of data files; the schema lives in the table metadata, and each snapshot records which schema it was written with. ALTER TABLE writes new table metadata and creates no new snapshot, so the newest snapshot and the current schema can disagree.

Presto resolved a time travel query's columns from the current schema, which is wrong three different ways:

CREATE TABLE t (a int, b int);
INSERT INTO t VALUES (1, 2);     -- snapshot 123, written with columns (a, b)
ALTER TABLE t DROP COLUMN b;     -- new schema removing b, still only snapshot 123. Or
ALTER TABLE t ADD COLUMN c;     -- new schema adding c, still only snapshot 123. Or
ALTER TABLE t RENAME b TO b_renamed;     -- new schema renaming b, still only snapshot 123

SELECT * FROM t FOR VERSION AS OF 123;  -- returned (1), should be (1, 2)
SELECT b FROM t FOR VERSION AS OF 123;  -- "Column 'b' cannot be resolved"
Schema change after the snapshot Before After
DROP COLUMN b b missing; SELECT b fails analysis (1, 2); SELECT b returns 2
ADD COLUMN c phantom c, all nulls (1); SELECT c fails analysis
RENAME b TO b_renamed resolves by the new name only resolves by the old name

The dropped-column case is the one that matters most: b's values are still in that snapshot's data files, and time travel is how you would go back and read them.

The fix needed two layers, and the connector alone is not enough

The issue suggests fixing IcebergUtil. That is necessary but not sufficient, and I confirmed that a connector-only change has no observable effect. The newly added regression tests still failed.

In StatementAnalyzer.visitTable, the column list came from getTableColumnsMetadata(...), which looks the table up by name and therefore builds a handle with no version on it (MetadataUtils.getTableColumnMetadata calls metadataResolver.getTableHandle(tableName)). The versioned handle was built separately on the next line and used only for reading. So no matter what the connector reported for a versioned handle, the query's field list came from the current schema.

The analyzer change is connector-agnostic, meaning that any connector that records a schema per version benefits.

Branches and tags are not the same here

FOR SYSTEM_VERSION AS OF '<name>' accepts a branch or a tag and resolves both to a snapshot id, discarding which it was. Iceberg treats them differently (schema selection with branches and tags):

  • a tag marks a point in history, so reading one uses its snapshot's schema
  • a branch is still being written to, so reading one uses the current schema

readsHistoricalSnapshot looks the name up in table.refs() to tell them apart. Treating every named version as historical breaks branch reads, which is what caught my first attempt.

Why commit 1 is a prerequisite

After a schema change that created no snapshot, a plain read and a pinned read can resolve to the same snapshot id and still need different schemas — resolveSnapshotIdByName fills in the current snapshot id for a plain read. So the snapshot id alone cannot decide which schema to use; only a flag saying "this query picked a snapshot itself" can. That flag was wrong for FOR VERSION AS OF.

Impact

Time travel reads now see the schema their snapshot was written with. Behaviour changes for FOR VERSION AS OF, FOR VERSION BEFORE, FOR TIMESTAMP AS OF/BEFORE, the "table@snapshotId" name form, and FOR SYSTEM_VERSION AS OF '<tag>'.

Unchanged: plain reads, FOR SYSTEM_VERSION AS OF '<branch>', and "table.branch_x" all continue to use the current schema.

IcebergDistributedTestBase.testRefsTable asserted the old behaviour and cited this issue in a comment; it now asserts that reading a tag sees the dropped column while reading a branch does not.

Test Plan

New and updated tests:

  • TestIcebergTableVersion#testTableVersionWithSchemaEvolution — covers drop, add and rename against a snapshot, and asserts that ALTER TABLE creates no new snapshot (so the pinned read and the plain read land on the same snapshot id). Fails on master.
  • TestIcebergTableVersion#testDeleteIsRefusedForOldSnapshot — asserts beginDelete throws and supportsMetadataDelete returns false for all four ways of picking a snapshot. It calls the two methods directly because the grammar attaches AS OF only to a table you select from, so no DELETE statement can reach them. Fails on master for the version-expression cases and passes for the "t@123" case, which is the asymmetry commit 1 fixes.
  • IcebergDistributedTestBase#testRefsTable — updated as described above.

Contributor checklist

  • Please make sure your submission complies with our contributing guide, in particular code style and commit standards.
  • PR description addresses the issue accurately and concisely. If the change is non-trivial, a GitHub Issue is referenced.
  • Documented new properties (with its default value), SQL syntax, functions, or other functionality.
  • If release notes are required, they follow the release notes guidelines.
  • Adequate tests were added if applicable.
  • CI passed.
  • If adding new dependencies, verified they have an OpenSSF Scorecard score of 5.0 or higher (or obtained explicit TSC approval for lower scores).

Release Notes

== RELEASE NOTES ==

Iceberg Connector Changes
* Fix time travel queries to read the schema recorded on the snapshot being read, rather than the table's current schema. Previously a column dropped after a snapshot was unreadable at that snapshot, a column added after it appeared as nulls, and a renamed column resolved by its new name.

Summary by Sourcery

Make Iceberg time travel reads use the schema associated with the selected snapshot while preserving current-schema behavior for non-historical reads.

Bug Fixes:

  • Fix Iceberg time travel queries to resolve columns using the schema recorded on the selected snapshot, preserving historical dropped and renamed columns while excluding columns added later.
  • Ensure all version-expression reads are marked as snapshot-specific so historical snapshots cannot be modified and receive consistent handling with snapshot-qualified table names.

Enhancements:

  • Preserve current-schema behavior for ordinary reads, branch references, and changelog reads while applying snapshot schemas to historical tags and snapshot-based reads.

Documentation:

  • Document Iceberg time travel schema behavior and the distinction between branch and tag reads.

Tests:

  • Add regression coverage for schema evolution across dropped, added, and renamed columns, snapshot selection forms, branch and tag references, historical deletes, and changelog schema behavior.

@prestodb-ci prestodb-ci added the from:IBM PR from IBM label Sep 17, 2026
@sourcery-ai

sourcery-ai Bot commented Sep 17, 2026

Copy link
Copy Markdown
Contributor

Reviewer's Guide

Fix Iceberg time-travel reads to resolve columns from the schema recorded on the selected historical snapshot, including version expressions, while preserving current-schema semantics for plain and branch reads. The analyzer now honors versioned handles, and regression tests cover schema evolution, refs, and delete protection.

Sequence diagram for Iceberg historical schema resolution

sequenceDiagram
    participant Query as Query
    participant Analyzer as StatementAnalyzer
    participant Metadata as IcebergMetadata
    participant Table as IcebergTable
    participant Snapshot as SnapshotSchema

    Query->>Analyzer: visitTable
    Analyzer->>Metadata: getTableHandle
    Metadata->>Table: readsHistoricalSnapshot
    alt historical snapshot
        Metadata->>Snapshot: SnapshotUtil.schemaFor
        Snapshot-->>Metadata: snapshot schema
    else plain read or branch
        Table-->>Metadata: current schema
    end
    Metadata-->>Analyzer: versioned table handle
    Analyzer->>Metadata: getTableMetadata(handle)
    Analyzer->>Metadata: getColumnHandles(handle)
    Metadata-->>Analyzer: columns from selected schema
Loading

Flow diagram for Iceberg read schema selection

flowchart TD
    A[Read table] --> B{Snapshot selected?}
    B -->|No| C[Use current schema]
    B -->|Yes| D{Historical snapshot?}
    D -->|Yes: snapshot, timestamp, or tag| E[Use schema recorded on snapshot]
    D -->|No: live branch| C
    E --> F[Resolve columns from versioned table handle]
    C --> G[Resolve columns from current table schema]
Loading

File-Level Changes

Change Details Files
Resolve versioned Iceberg reads using the schema associated with the selected snapshot while preserving current-schema behavior for plain and live-branch reads.
  • Determine whether a table version refers to historical data, distinguishing tags from branches and snapshot/time expressions.
  • Fetch and serialize the snapshot schema into the table handle, then use it for table metadata and column-handle construction.
  • Mark all explicitly versioned reads as snapshot-specific, including version-expression forms, and retain protection against metadata deletes.
  • Allow the analyzer to obtain columns and handles from the versioned table handle rather than the name-only current-schema lookup.
presto-iceberg/src/main/java/com/facebook/presto/iceberg/IcebergAbstractMetadata.java
presto-iceberg/src/main/java/com/facebook/presto/iceberg/IcebergUtil.java
presto-main-base/src/main/java/com/facebook/presto/sql/analyzer/StatementAnalyzer.java
Add regression coverage for schema evolution and snapshot-specific mutation protection.
  • Verify dropped, added, and renamed columns resolve according to the historical snapshot schema.
  • Verify tags use historical schemas while branches and ordinary reads use the current schema.
  • Verify metadata deletes are refused for snapshots selected by table-name, version, timestamp, and before expressions.
presto-iceberg/src/test/java/com/facebook/presto/iceberg/TestIcebergTableVersion.java
presto-iceberg/src/test/java/com/facebook/presto/iceberg/IcebergDistributedTestBase.java

Assessment against linked issues

Issue Objective Addressed Explanation
#23553 Resolve time-travel Iceberg reads using the schema recorded by the selected snapshot, rather than the table's current schema, including schema evolution cases such as dropped, added, and renamed columns.
#23553 Ensure schema selection is applied throughout query analysis and connector metadata resolution for all supported snapshot/time-travel forms, while preserving current-schema behavior for ordinary reads and live branches.
#23553 Add regression coverage demonstrating correct historical-schema behavior and handling of snapshot-specific operations for versioned reads.

Tips and commands

Interacting with Sourcery

  • Trigger a new review: Comment @sourcery-ai review on the pull request.
  • Continue discussions: Reply directly to Sourcery's review comments.
  • Generate a GitHub issue from a review comment: Ask Sourcery to create an
    issue from a review comment by replying to it. You can also reply to a
    review comment with @sourcery-ai issue to create an issue from it.
  • Generate a pull request title: Write @sourcery-ai anywhere in the pull
    request title to generate a title at any time. You can also comment
    @sourcery-ai title on the pull request to (re-)generate the title at any time.
  • Generate a pull request summary: Write @sourcery-ai summary anywhere in
    the pull request body to generate a PR summary at any time exactly where you
    want it. You can also comment @sourcery-ai summary on the pull request to
    (re-)generate the summary at any time.
  • Generate reviewer's guide: Comment @sourcery-ai guide on the pull
    request to (re-)generate the reviewer's guide at any time.
  • Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
    pull request to resolve all Sourcery comments. Useful if you've already
    addressed all the comments and don't want to see them anymore.
  • Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
    request to dismiss all existing Sourcery reviews. Especially useful if you
    want to start fresh with a new review - don't forget to comment
    @sourcery-ai review to trigger a new review!

Customizing Your Experience

Access your dashboard to:

  • Enable or disable review features such as the Sourcery-generated pull request
    summary, the reviewer's guide, and others.
  • Change the review language.
  • Add, remove or edit custom review instructions.
  • Adjust other review settings.

Getting Help

A query can pick one old snapshot in two ways:

    SELECT ... FROM t FOR VERSION AS OF 123
    SELECT ... FROM "t@123"

IcebergTableHandle.isSnapshotSpecified says whether a read picked one snapshot.
It was set only for the second way, so the first way claimed it was reading the
table's newest data.

The flag is needed because the snapshot id cannot answer that question on its
own. For a plain read, resolveSnapshotIdByName fills in the current snapshot id,
so both kinds of read carry one, and only this flag tells them apart.

No user query misbehaves today. Three methods read the flag -- tableExecute,
beginDelete and supportsMetadataDelete -- and all three refuse to change a table
through a read of one old snapshot. DELETE FROM "t@123" reaches them and is
refused. DELETE ... FOR VERSION AS OF cannot be written at all, because the
grammar attaches AS OF only to a table you select from. tableExecute has no
caller anywhere.

It still has to be fixed, because reading an old snapshot's schema depends on it.
Iceberg keeps data history and schema apart: a snapshot is a set of data files,
while the schema lives in the table metadata. ALTER TABLE writes new table
metadata and makes no new snapshot. So after

    CREATE TABLE t (a int, b int);
    INSERT INTO t VALUES (1, 2);     -- snapshot 123, columns (a, b)
    ALTER TABLE t DROP COLUMN b;     -- new schema, still only snapshot 123

both of these resolve to snapshot 123:

    SELECT * FROM t                        -- must return (1)
    SELECT * FROM t FOR VERSION AS OF 123  -- must return (1, 2)

Same snapshot id, two different correct answers, so the snapshot id cannot tell
them apart. Only this flag can. The next commit uses it to fix that read.

The test calls beginDelete and supportsMetadataDelete directly, because no DELETE
statement can reach them with AS OF.
@yingsu00
yingsu00 force-pushed the iceberg-schema-bug-fix branch from 3b4a0a2 to 039c8aa Compare September 17, 2026 07:16
@yingsu00 yingsu00 changed the title fix(iceberg): Read a time travel query with the schema recorded on its snapshot fix(connector): Read a time travel query with the schema recorded on its snapshot Sep 17, 2026
@yingsu00
yingsu00 marked this pull request as ready for review September 18, 2026 07:50
@prestodb-ci
prestodb-ci requested a review from a team September 18, 2026 07:50

@sourcery-ai sourcery-ai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hey - I've reviewed your changes and they look great!


Sourcery is free for open source - if you like our reviews please consider sharing them ✨

agrawalreetika
agrawalreetika previously approved these changes Sep 18, 2026

@agrawalreetika agrawalreetika left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @yingsu00 Changes lgtm.
This covers #23553 as well

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Changes recommended

Explicit changelog reads can receive inconsistent historical metadata and current-schema column handles after schema evolution.

Get a fresh assessment by requesting another Copilot review.

Pull request overview

Fixes #23553 by resolving Iceberg time-travel columns from the selected snapshot’s schema.

Changes:

  • Re-fetches metadata using versioned table handles.
  • Stores snapshot-appropriate schemas while preserving branch behavior.
  • Adds schema-evolution and mutation-safety regression coverage.
File summaries
File Description
StatementAnalyzer.java Resolves columns from versioned handles.
IcebergUtil.java Selects current or snapshot schema.
IcebergAbstractMetadata.java Propagates read schemas through Iceberg metadata.
TestIcebergTableVersion.java Tests schema evolution and delete safeguards.
IcebergDistributedTestBase.java Updates branch/tag expectations.
Review details
  • Files reviewed: 5/5 changed files
  • Comments generated: 2
  • Review effort level: Balanced

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

// filesystem metadata will fail.
// See https://github.com/prestodb/presto/pull/21181
Optional<Schema> tableSchema = tryGetSchema(table);
Optional<Schema> tableSchema = tryGetReadSchema(table, readsHistoricalSnapshot(table, tableVersion, name), tableSnapshotId);

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good catch, thank you - this was a real inconsistency, so a changelog read is now left on the current schema.

tryGetReadSchema returns the current schema when the table type is CHANGELOG, so the handle a changelog read carries reports the same schema its column handles (getColumnHandles) and its splits (ChangelogSplitSource) are built from. Changing all the changelog paths to the historical schema would be a larger change than this fix, and it is not needed for the bug being fixed here.

Added TestIcebergTableChangelog.testChangelogOfAnOldSnapshotUsesTheCurrentSchema, which drops a column after a snapshot and then checks SHOW COLUMNS FROM "t@<old snapshot>$changelog" reports rowdata as row("a" integer), and that the changelog is still readable. Without the CHANGELOG case the new test fails, so the behaviour is now pinned.

* is being read.
*
* The question used to be answered correctly by the handle for "t@123" but not for
* FOR VERSION AS OF, so the second way was refused while the first way was not.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks - the order in that sentence was right, but only if the reader maps "the second way" back to the order the two ways were listed in above, which is too easy to lose. It now names them:

The question used to be answered correctly by the handle for "t@123" but not for FOR VERSION AS OF, so a delete through "t@123" was refused while one through FOR VERSION AS OF was not.

Which matches the old behaviour: snapshotSpecified was set only for the "t@123" form, so a delete through it was refused, while FOR VERSION AS OF was not refused.

@imjalpreet imjalpreet left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks, @yingsu00.

Could you please take a look at one of the suggestions from Copilot: https://github.com/prestodb/presto/pull/28503/changes#r4050590794?

Apart from that I have added a couple of minor suggestions.

Also, I feel we should probably update the documentation as well. We could add which schema would be used for Time Travel and which schema would be used for a branch. Do you think it makes sense?

Since this PR also includes changes in the analyzer maybe we can update the PR title scope to -> fix(analyzer, iceberg): ...

Comment on lines +1961 to +1965
ConnectorTableVersion version = tableVersion.get();
if (version.getVersionType() == VersionType.VERSION && version.getVersionExpressionType() instanceof VarcharType) {
SnapshotRef ref = table.refs().get(((Slice) version.getTableVersion()).toStringUtf8());
return ref != null && ref.isTag();
}

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggestion from my side: I think we could reuse an Iceberg utility method for this case, as Iceberg already implements the tag/branch rule via SnapshotUtil.schemaFor(Table, String ref).

But this would require a bit of a refactor to combine readsHistoricalSnapshot + tryGetReadSchema into one schema-returning method handling all the cases.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done, thank you - this reads much better, and it removes our own copy of Iceberg's rule.

readsHistoricalSnapshot is gone, and IcebergUtil.tryGetReadSchema(Table, IcebergTableName, Optional<ConnectorTableVersion>, Optional<Long>) now returns the schema for every case:

  • FOR SYSTEM_VERSION AS OF '<ref>' -> SnapshotUtil.schemaFor(table, ref), which returns the schema of the tag's snapshot for a tag, and the current schema for a branch or an unknown name
  • a snapshot id or a timestamp ("t@123", FOR VERSION AS OF <id>, FOR TIMESTAMP AS OF) -> SnapshotUtil.schemaFor(table, snapshotId)
  • a plain read, "t.branch_x", and a changelog -> the current schema

testRefsTable still asserts that a tag read sees the dropped column while a branch read does not, so the tag/branch rule stays covered end to end.

Comment on lines +932 to +937
return Optional.ofNullable(table.schema());
}
catch (TableNotFoundException e) {
log.warn(String.format("Unable to fetch schema for table %s: %s", table.name(), e.getMessage()));
return Optional.empty();
}

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: duplicate, we could delegate to the IcebergUtil.tryGetSchema method just above this

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done - every case that wants the current schema now returns tryGetSchema(table), so the table.schema() call and its TableNotFoundException handling are no longer duplicated. What is left is one small helper for the two SnapshotUtil.schemaFor calls, which need the same logging and fallback.

The columns of a time travel query were resolved from the table's
current schema, so the wrong columns were returned when an old snapshot
was asked for:

    CREATE TABLE t (a int, b int);
    INSERT INTO t VALUES (1, 2);     -- snapshot 123
    ALTER TABLE t DROP COLUMN b;

    SELECT * FROM t FOR VERSION AS OF 123  -- returned (1), should be (1, 2)
    SELECT b FROM t FOR VERSION AS OF 123  -- "Column 'b' cannot be resolved"

Column b's values are still held in that snapshot's data files, and
time travel is how they are read, so this is the case that matters
most. An added column was the mirror problem: a column that the old
snapshot never had was shown, filled with nulls. A renamed column was
resolved by its new name at a snapshot where only the old name was
known.

Fixes prestodb#23553

Data history and schema are kept apart by Iceberg. A snapshot is a set
of data files, the schema is held in the table metadata, and the schema
a snapshot was written with is recorded on it. New table metadata is
written by ALTER TABLE and no new snapshot is made, so the newest
snapshot and the current schema can disagree.

This commit contains two layers of fixes:

In the analyzer, the column list was taken from getTableColumnsMetadata,
where the table is looked up by name alone, so the handle it builds
carries no version. The versioned handle was built separately and used
only for reading, so the connector was never asked which columns that
version has. The columns are now re-asked through the versioned handle
in visitTable. This part is connector-agnostic: any connector where a
schema is recorded per version is helped by it.

In the Iceberg connector, the read schema is now taken from the
snapshot by Iceberg's own SnapshotUtil.schemaFor, and the current schema
is used as a fallback for a snapshot that recorded none. The schema is
decided once in getTableHandle and stored in the handle's
tableSchemaJson, from where it is reused by getColumnHandles and
getTableMetadata instead of being worked out again.

Branches and tags are treated differently here, as Iceberg requires. A
point in history is marked by a tag, so the schema of its snapshot is
used. A branch is still being written to, so the current schema is
used. Either can be named by FOR SYSTEM_VERSION AS OF and both are
resolved to a snapshot id, so the two are told apart by Iceberg's own
SnapshotUtil.schemaFor(Table, String), which applies that rule itself.

A changelog is left on the current schema. Its rows are reported as one
rowdata column, and that column, its column handles and its splits are
all built from the current schema, so reporting the schema of an old
snapshot would advertise a column that is then not read.

The previous commit is needed for this. After a schema change that made
no snapshot, one snapshot id can be reached both by a plain read and by
a pinned read, and different schemas are still needed, so the choice
cannot be made from the snapshot id alone.

The old behaviour was asserted by testRefsTable, where this bug was
cited. It is now asserted that the dropped column is seen when a tag is
read and is not seen when a branch is read.

Which schema each kind of read uses is now written down in the Iceberg
connector documentation.
@yingsu00 yingsu00 changed the title fix(connector): Read a time travel query with the schema recorded on its snapshot fix(analyzer, iceberg): Read a time travel query with the schema recorded on its snapshot Sep 19, 2026
@yingsu00
yingsu00 force-pushed the iceberg-schema-bug-fix branch from 039c8aa to 86a4175 Compare September 19, 2026 08:58
@yingsu00

Copy link
Copy Markdown
Contributor Author

Thanks @imjalpreet - all four are addressed, and the PR title scope is updated to fix(analyzer, iceberg).

  • Copilot's changelog point: a changelog read is now left on the current schema, which is what its column handles and splits are built from. Reply and new test here.
  • SnapshotUtil.schemaFor(Table, String): readsHistoricalSnapshot is gone, and one method now returns the schema for every case, with Iceberg applying the tag/branch rule itself. Reply here.
  • The tryGetSchema duplication: delegated. Reply here.
  • Documentation: yes, it makes sense - the Iceberg connector page has a new section, "Schema used by a time travel query", listing which reads use the schema recorded on the snapshot (snapshot id, timestamp, "t@<id>", a tag) and which use the current schema (a plain read, a branch, either syntax), with a worked DROP COLUMN example and a link to Iceberg's own rule.

Tests: TestIcebergTableVersion, TestIcebergTableChangelog and TestIcebergSystemTables pass (50 tests). I also checked the new changelog test fails without the CHANGELOG case, so it guards the behaviour rather than just passing.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

from:IBM PR from IBM

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Iceberg] While time travel Iceberg is not using schema respective to a given Snapshot

5 participants