fix(scan): reject missing column stats fields
diff --git a/src/iceberg/table_scan.cc b/src/iceberg/table_scan.cc index 1e87b03..d0a214d 100644 --- a/src/iceberg/table_scan.cc +++ b/src/iceberg/table_scan.cc
@@ -400,9 +400,8 @@ 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 fea1532..87db9b5 100644 --- a/src/iceberg/test/table_scan_test.cc +++ b/src/iceberg/test/table_scan_test.cc
@@ -285,6 +285,16 @@ } } +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,