@@ -66,6 +66,7 @@ namespace Setting
6666 extern const SettingsBool cluster_function_process_archive_on_multiple_nodes;
6767 extern const SettingsBool table_engine_read_through_distributed_cache;
6868 extern const SettingsBool use_object_storage_list_objects_cache;
69+ extern const SettingsBool allow_experimental_iceberg_read_optimization;
6970}
7071
7172namespace ErrorCodes
@@ -279,6 +280,8 @@ Chunk StorageObjectStorageSource::generate()
279280{
280281 lazyInitialize ();
281282
283+ bool use_iceberg_read_optimization = read_context->getSettingsRef ()[Setting::allow_experimental_iceberg_read_optimization];
284+
282285 while (true )
283286 {
284287 if (isCancelled () || !reader)
@@ -333,11 +336,14 @@ Chunk StorageObjectStorageSource::generate()
333336 .etag = &(object_info->metadata ->etag )},
334337 read_context);
335338
336- for ( const auto & constant_column : reader. constant_columns_with_values )
339+ if (use_iceberg_read_optimization )
337340 {
338- chunk.addColumn (constant_column.first ,
339- constant_column.second .name_and_type .type ->createColumnConst (
340- chunk.getNumRows (), constant_column.second .value )->convertToFullColumnIfConst ());
341+ for (const auto & constant_column : reader.constant_columns_with_values )
342+ {
343+ chunk.addColumn (constant_column.first ,
344+ constant_column.second .name_and_type .type ->createColumnConst (
345+ chunk.getNumRows (), constant_column.second .value )->convertToFullColumnIfConst ());
346+ }
341347 }
342348
343349 if (chunk_size && chunk.hasColumns ())
@@ -551,61 +557,64 @@ StorageObjectStorageSource::ReaderHolder StorageObjectStorageSource::createReade
551557 physical_columns_names[++column_counter] = column.getNameInStorage ();
552558 // / now column_counter contains maximum column index
553559
554- auto file_meta_data = object_info->getFileMetaInfo ();
555- if (file_meta_data.has_value ())
560+ NamesAndTypesList requested_columns_copy = read_from_format_info.requested_columns ;
561+
562+ if (context_->getSettingsRef ()[Setting::allow_experimental_iceberg_read_optimization])
556563 {
557- for (const auto & column : file_meta_data.value ()->columns_info )
564+ auto file_meta_data = object_info->getFileMetaInfo ();
565+ if (file_meta_data.has_value ())
558566 {
559- if ( column. second . hyperrectangle . has_value () )
567+ for ( const auto & column : file_meta_data. value ()-> columns_info )
560568 {
561- if (column.second .hyperrectangle .value (). isPoint ())
569+ if (column.second .hyperrectangle .has_value ())
562570 {
563- auto column_id = column.first ;
571+ if (column.second .hyperrectangle .value ().isPoint ())
572+ {
573+ auto column_id = column.first ;
564574
565- if (column_id <= 0 || column_id > column_counter)
566- { // / Something wrong, ignore file metadata
567- LOG_WARNING (log, " Incorrect column ID: {}, ignoring file metadata" , column_id);
568- constant_columns.clear ();
569- break ;
570- }
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 ;
580+ }
571581
572- const auto & column_name = physical_columns_names[column_id];
582+ const auto & column_name = physical_columns_names[column_id];
573583
574- auto i_column = requested_columns_list.find (column_name);
575- if (i_column == requested_columns_list.end ())
576- continue ;
584+ auto i_column = requested_columns_list.find (column_name);
585+ if (i_column == requested_columns_list.end ())
586+ continue ;
577587
578- // / isPoint() method checks that left==right
579- constant_columns_with_values[i_column->second .first ] =
580- ConstColumnWithValue{
581- i_column->second .second ,
582- column.second .hyperrectangle .value ().left
583- };
584- constant_columns.insert (column_name);
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);
585595
586- LOG_DEBUG (log, " In file {} constant column {} with value {}" ,
587- object_info->getPath (), column_name, column.second .hyperrectangle .value ().left .dump ());
596+ LOG_DEBUG (log, " In file {} constant column {} with value {}" ,
597+ object_info->getPath (), column_name, column.second .hyperrectangle .value ().left .dump ());
598+ }
588599 }
589600 }
590601 }
591- }
592-
593- NamesAndTypesList requested_columns_copy = read_from_format_info.requested_columns ;
594602
595- if (!constant_columns.empty ())
596- {
597- size_t original_columns = requested_columns_copy.size ();
598- requested_columns_copy = requested_columns_copy.eraseNames (constant_columns);
599- if (requested_columns_copy.size () + constant_columns.size () != original_columns)
603+ if (!constant_columns.empty ())
600604 {
601- LOG_WARNING (log, " Can't remove constant columns for file {} correct, fallback to read. Founded constant columns: [{}]" ,
602- object_info->getPath (), constant_columns);
603- requested_columns_copy = read_from_format_info.requested_columns ;
604- constant_columns.clear ();
605- constant_columns_with_values.clear ();
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)
608+ {
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 ();
614+ }
615+ else if (requested_columns_copy.empty ())
616+ need_only_count = true ;
606617 }
607- else if (requested_columns_copy.empty ())
608- need_only_count = true ;
609618 }
610619
611620 std::optional<size_t > num_rows_from_cache
0 commit comments