From f14a1a9bbdad6ba184a26afd03cfaabec2c1b93a Mon Sep 17 00:00:00 2001 From: Minh Vu Date: Thu, 18 Jun 2026 18:39:39 +0200 Subject: [PATCH] fix(scan): reject missing column stats fields --- src/iceberg/table_scan.cc | 5 ++--- src/iceberg/test/table_scan_test.cc | 10 ++++++++++ 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/iceberg/table_scan.cc b/src/iceberg/table_scan.cc index 1e87b03e7..d0a214d07 100644 --- a/src/iceberg/table_scan.cc +++ b/src/iceberg/table_scan.cc @@ -400,9 +400,8 @@ Status TableScanBuilder::ResolveColumnStatsSelection() { const auto& schema = schema_ref.get(); for (const auto& column_name : *requested_column_stats_) { ICEBERG_ASSIGN_OR_RAISE(auto field, schema->FindFieldByName(column_name)); - if (field.has_value()) { - context_.columns_to_keep_stats.insert(field.value().get().field_id()); - } + ICEBERG_CHECK(field.has_value(), "Cannot find stats column: {}", column_name); + context_.columns_to_keep_stats.insert(field.value().get().field_id()); } return {}; diff --git a/src/iceberg/test/table_scan_test.cc b/src/iceberg/test/table_scan_test.cc index fea153230..87db9b505 100644 --- a/src/iceberg/test/table_scan_test.cc +++ b/src/iceberg/test/table_scan_test.cc @@ -285,6 +285,16 @@ TEST_P(TableScanTest, IncludeColumnStatsUsesFinalSnapshotSchema) { } } +TEST_P(TableScanTest, IncludeColumnStatsRejectsMissingColumn) { + ICEBERG_UNWRAP_OR_FAIL(auto builder, + DataTableScanBuilder::Make(table_metadata_, file_io_)); + builder->IncludeColumnStats({"missing"}); + + EXPECT_THAT(builder->Build(), + ::testing::AllOf(IsError(ErrorKind::kValidationFailed), + HasErrorMessage("Cannot find stats column: missing"))); +} + TEST_P(TableScanTest, TableScanBuilderValidationErrors) { // Test negative min rows ICEBERG_UNWRAP_OR_FAIL(auto builder,