@@ -340,6 +340,11 @@ Chunk StorageObjectStorageSource::generate()
340340 {
341341 for (const auto & constant_column : reader.constant_columns_with_values )
342342 {
343+ LOG_DEBUG (log, " Restore constant column '{}' index {} with value '{}'" ,
344+ constant_column.second .name_and_type .name ,
345+ constant_column.first ,
346+ constant_column.second .value
347+ );
343348 chunk.addColumn (constant_column.first ,
344349 constant_column.second .name_and_type .type ->createColumnConst (
345350 chunk.getNumRows (), constant_column.second .value )->convertToFullColumnIfConst ());
@@ -543,77 +548,64 @@ StorageObjectStorageSource::ReaderHolder StorageObjectStorageSource::createReade
543548 std::map<size_t , ConstColumnWithValue> constant_columns_with_values;
544549 std::unordered_set<String> constant_columns;
545550
551+ NamesAndTypesList requested_columns_copy = read_from_format_info.requested_columns ;
552+
546553 std::unordered_map<String, std::pair<size_t , NameAndTypePair>> requested_columns_list;
547554 {
548555 size_t column_index = 0 ;
549- for (const auto & column : read_from_format_info. requested_columns )
556+ for (const auto & column : requested_columns_copy )
550557 requested_columns_list[column.getNameInStorage ()] = std::make_pair (column_index++, column);
551558 }
552559
553- std::unordered_map<Int32, String> physical_columns_names;
554- Int32 column_counter = 0 ;
555- // / In Iceberg metadata columns' numbers starts from 1, so preincrement used
556- for (const auto & column : read_from_format_info.physical_columns )
557- physical_columns_names[++column_counter] = column.getNameInStorage ();
558- // / now column_counter contains maximum column index
559-
560- NamesAndTypesList requested_columns_copy = read_from_format_info.requested_columns ;
561-
562560 if (context_->getSettingsRef ()[Setting::allow_experimental_iceberg_read_optimization])
563561 {
564- auto file_meta_data = object_info-> getFileMetaInfo ();
565- if (file_meta_data .has_value ())
562+ auto schema = configuration-> tryGetTableStructureFromMetadata ();
563+ if (schema .has_value ())
566564 {
567- for (const auto & column : file_meta_data.value ()->columns_info )
565+ auto file_meta_data = object_info->getFileMetaInfo ();
566+ if (file_meta_data.has_value ())
568567 {
569- if ( column. second . hyperrectangle . has_value () )
568+ for ( const auto & column : file_meta_data. value ()-> columns_info )
570569 {
571- if (column.second .hyperrectangle .value (). isPoint ())
570+ if (column.second .hyperrectangle .has_value ())
572571 {
573- auto column_id = column.first ;
574-
575- if (column_id <= 0 || column_id > column_counter)
576- { // / Something wrong, ignore file metadata
577- LOG_WARNING (log, " Incorrect column ID: {}, ignoring file metadata" , column_id);
578- constant_columns.clear ();
579- break ;
572+ if (column.second .hyperrectangle .value ().isPoint ())
573+ {
574+ auto column_name = column.first ;
575+
576+ auto i_column = requested_columns_list.find (column_name);
577+ if (i_column == requested_columns_list.end ())
578+ continue ;
579+
580+ // / isPoint() method checks that left==right
581+ constant_columns_with_values[i_column->second .first ] =
582+ ConstColumnWithValue{
583+ i_column->second .second ,
584+ column.second .hyperrectangle .value ().left
585+ };
586+ constant_columns.insert (column_name);
587+
588+ LOG_DEBUG (log, " In file {} constant column '{}' id {} type '{}' with value '{}'" ,
589+ object_info->getPath (),
590+ column_name,
591+ i_column->second .first ,
592+ i_column->second .second .type ,
593+ column.second .hyperrectangle .value ().left .dump ());
580594 }
581-
582- const auto & column_name = physical_columns_names[column_id];
583-
584- auto i_column = requested_columns_list.find (column_name);
585- if (i_column == requested_columns_list.end ())
586- continue ;
587-
588- // / isPoint() method checks that left==right
589- constant_columns_with_values[i_column->second .first ] =
590- ConstColumnWithValue{
591- i_column->second .second ,
592- column.second .hyperrectangle .value ().left
593- };
594- constant_columns.insert (column_name);
595-
596- LOG_DEBUG (log, " In file {} constant column {} with value {}" ,
597- object_info->getPath (), column_name, column.second .hyperrectangle .value ().left .dump ());
598595 }
599596 }
600597 }
601- }
602598
603- if (!constant_columns.empty ())
604- {
605- size_t original_columns = requested_columns_copy.size ();
606- requested_columns_copy = requested_columns_copy.eraseNames (constant_columns);
607- if (requested_columns_copy.size () + constant_columns.size () != original_columns)
599+ if (!constant_columns.empty ())
608600 {
609- LOG_WARNING (log, " Can't remove constant columns for file {} correct, fallback to read. Founded constant columns: [{}]" ,
610- object_info->getPath (), constant_columns);
611- requested_columns_copy = read_from_format_info.requested_columns ;
612- constant_columns.clear ();
613- constant_columns_with_values.clear ();
601+ size_t original_columns = requested_columns_copy.size ();
602+ requested_columns_copy = requested_columns_copy.eraseNames (constant_columns);
603+ if (requested_columns_copy.size () + constant_columns.size () != original_columns)
604+ throw Exception (ErrorCodes::LOGICAL_ERROR, " Can't remove constant columns for file {} correct, fallback to read. Founded constant columns: [{}]" ,
605+ object_info->getPath (), constant_columns);
606+ if (requested_columns_copy.empty ())
607+ need_only_count = true ;
614608 }
615- else if (requested_columns_copy.empty ())
616- need_only_count = true ;
617609 }
618610 }
619611
0 commit comments