diff --git a/core/src/main/java/org/apache/iceberg/AllManifestsTable.java b/core/src/main/java/org/apache/iceberg/AllManifestsTable.java index 16f38c0aa2f1..935578799075 100644 --- a/core/src/main/java/org/apache/iceberg/AllManifestsTable.java +++ b/core/src/main/java/org/apache/iceberg/AllManifestsTable.java @@ -119,7 +119,7 @@ protected TableScan newRefinedScan(Table table, Schema schema, TableScanContext @Override protected CloseableIterable doPlanFiles() { FileIO io = table().io(); - Map specs = Maps.newHashMap(table().specs()); + Map specs = Maps.newHashMap(specs()); Schema dataTableSchema = table().schema(); Expression filter = shouldIgnoreResiduals() ? Expressions.alwaysTrue() : filter(); diff --git a/core/src/main/java/org/apache/iceberg/BaseDistributedDataScan.java b/core/src/main/java/org/apache/iceberg/BaseDistributedDataScan.java index 89c7f0b6067e..c69f71f2fdec 100644 --- a/core/src/main/java/org/apache/iceberg/BaseDistributedDataScan.java +++ b/core/src/main/java/org/apache/iceberg/BaseDistributedDataScan.java @@ -300,7 +300,7 @@ private DeleteFileIndex planDeletesLocally(List deleteManifests) { } return builder - .specsById(table().specs()) + .specsById(specs()) .filterData(filter()) .caseSensitive(isCaseSensitive()) .scanMetrics(scanMetrics()) diff --git a/core/src/main/java/org/apache/iceberg/DataScan.java b/core/src/main/java/org/apache/iceberg/DataScan.java index 1c48042f52f0..1acbbbf6826a 100644 --- a/core/src/main/java/org/apache/iceberg/DataScan.java +++ b/core/src/main/java/org/apache/iceberg/DataScan.java @@ -53,7 +53,7 @@ protected ManifestGroup newManifestGroup( .caseSensitive(isCaseSensitive()) .select(withColumnStats ? SCAN_WITH_STATS_COLUMNS : SCAN_COLUMNS) .filterData(filter()) - .specsById(table().specs()) + .specsById(specs()) .scanMetrics(scanMetrics()) .ignoreDeleted() .columnsToKeepStats(columnsToKeepStats()); diff --git a/core/src/main/java/org/apache/iceberg/DataTableScan.java b/core/src/main/java/org/apache/iceberg/DataTableScan.java index 8463112b7a51..4d23dd525e07 100644 --- a/core/src/main/java/org/apache/iceberg/DataTableScan.java +++ b/core/src/main/java/org/apache/iceberg/DataTableScan.java @@ -74,7 +74,7 @@ public CloseableIterable doPlanFiles() { .caseSensitive(isCaseSensitive()) .select(scanColumns()) .filterData(filter()) - .specsById(table().specs()) + .specsById(specs()) .scanMetrics(scanMetrics()) .ignoreDeleted() .columnsToKeepStats(columnsToKeepStats()); diff --git a/core/src/main/java/org/apache/iceberg/SnapshotScan.java b/core/src/main/java/org/apache/iceberg/SnapshotScan.java index a98a8c9f13b1..b5ebb0a8064a 100644 --- a/core/src/main/java/org/apache/iceberg/SnapshotScan.java +++ b/core/src/main/java/org/apache/iceberg/SnapshotScan.java @@ -79,6 +79,22 @@ protected ScanMetrics scanMetrics() { return scanMetrics; } + protected Map specs() { + Map specs = table().specs(); + // requires latest schema + if (!useSnapshotSchema() || snapshotId() == null) { + return specs; + } + + // this is a time travel request + Schema snapshotSchema = tableSchema(); + Map newSpecs = Maps.newHashMapWithExpectedSize(specs.size()); + for (Map.Entry entry : specs.entrySet()) { + newSpecs.put(entry.getKey(), entry.getValue().toUnbound().bindUnchecked(snapshotSchema)); + } + return newSpecs; + } + public ThisT useSnapshot(long scanSnapshotId) { Preconditions.checkArgument( snapshotId() == null, "Cannot override snapshot, already set snapshot id=%s", snapshotId());