diff --git a/plugin/trino-iceberg/src/main/java/io/trino/plugin/iceberg/IcebergPageSourceProvider.java b/plugin/trino-iceberg/src/main/java/io/trino/plugin/iceberg/IcebergPageSourceProvider.java index 1911d5d4426d..887f7203d8f1 100644 --- a/plugin/trino-iceberg/src/main/java/io/trino/plugin/iceberg/IcebergPageSourceProvider.java +++ b/plugin/trino-iceberg/src/main/java/io/trino/plugin/iceberg/IcebergPageSourceProvider.java @@ -93,6 +93,7 @@ import org.apache.iceberg.io.InputFile; import org.apache.iceberg.mapping.MappedField; import org.apache.iceberg.mapping.MappedFields; +import org.apache.iceberg.mapping.MappingUtil; import org.apache.iceberg.mapping.NameMapping; import org.apache.iceberg.mapping.NameMappingParser; import org.apache.iceberg.parquet.ParquetSchemaUtil; @@ -499,6 +500,7 @@ private ReaderPageSourceWithRowPositions createDataPageSource( inputFile, start, length, + fileSchema, dataColumns, predicate, orcReaderOptions @@ -582,6 +584,7 @@ private static ReaderPageSourceWithRowPositions createOrcPageSource( TrinoInputFile inputFile, long start, long length, + Schema fileSchema, List columns, TupleDomain effectivePredicate, OrcReaderOptions options, @@ -598,6 +601,11 @@ private static ReaderPageSourceWithRowPositions createOrcPageSource( .orElseThrow(() -> new TrinoException(ICEBERG_BAD_DATA, "ORC file is zero length")); Map fileColumnsByIcebergId = fileColumnsByIcebergId(reader, nameMapping); + if (fileColumnsByIcebergId.isEmpty()) { + // When name mapping is not present in table metadata, and iceberg.id is not present in all file columns + // Try to recover by deriving name mapping from the table schema. + fileColumnsByIcebergId = fileColumnsByIcebergId(reader, Optional.of(MappingUtil.create(fileSchema))); + } TupleDomainOrcPredicateBuilder predicateBuilder = TupleDomainOrcPredicate.builder() .setBloomFiltersEnabled(options.isBloomFiltersEnabled());