@@ -472,6 +472,8 @@ StorageObjectStorageSource::ReaderHolder StorageObjectStorageSource::createReade
472472 ObjectInfoPtr object_info;
473473 auto query_settings = configuration->getQuerySettings (context_);
474474
475+ ObjectStoragePtr storage_to_use = object_storage;
476+
475477 bool not_a_path = false ;
476478
477479 do
@@ -499,7 +501,10 @@ StorageObjectStorageSource::ReaderHolder StorageObjectStorageSource::createReade
499501 if (object_info->getPath ().empty ())
500502 return {};
501503
502- object_info->loadMetadata (object_storage, query_settings.ignore_non_existent_file );
504+ if (auto storage_for_file = object_info->getObjectStorage (); storage_for_file.has_value ())
505+ storage_to_use = storage_for_file.value ();
506+
507+ object_info->loadMetadata (storage_to_use, query_settings.ignore_non_existent_file );
503508 }
504509 while (not_a_path || (query_settings.skip_empty_files && object_info->metadata ->size_bytes == 0 ));
505510
@@ -552,7 +557,7 @@ StorageObjectStorageSource::ReaderHolder StorageObjectStorageSource::createReade
552557 else
553558 {
554559 compression_method = chooseCompressionMethod (object_info->getFileName (), configuration->getCompressionMethod ());
555- read_buf = createReadBuffer (*object_info, object_storage , context_, log);
560+ read_buf = createReadBuffer (*object_info, storage_to_use , context_, log);
556561 }
557562
558563 Block initial_header = read_from_format_info.format_header ;
@@ -644,14 +649,16 @@ std::unique_ptr<ReadBufferFromFileBase> StorageObjectStorageSource::createReadBu
644649 const auto & settings = context_->getSettingsRef ();
645650 const auto & effective_read_settings = read_settings.has_value () ? read_settings.value () : context_->getReadSettings ();
646651
652+ ObjectStoragePtr storage_to_use = object_info.getObjectStorage ().value_or (object_storage);
653+
647654 bool use_distributed_cache = false ;
648655#if ENABLE_DISTRIBUTED_CACHE
649656 ObjectStorageConnectionInfoPtr connection_info;
650657 if (settings[Setting::table_engine_read_through_distributed_cache]
651658 && DistributedCache::Registry::instance ().isReady (
652659 effective_read_settings.distributed_cache_settings .read_only_from_current_az ))
653660 {
654- connection_info = object_storage ->getConnectionInfo ();
661+ connection_info = storage_to_use ->getConnectionInfo ();
655662 if (connection_info)
656663 use_distributed_cache = true ;
657664 }
@@ -664,15 +671,15 @@ std::unique_ptr<ReadBufferFromFileBase> StorageObjectStorageSource::createReadBu
664671 filesystem_cache_name = settings[Setting::filesystem_cache_name].value ;
665672 use_filesystem_cache = effective_read_settings.enable_filesystem_cache
666673 && !filesystem_cache_name.empty ()
667- && (object_storage ->getType () == ObjectStorageType::Azure
668- || object_storage ->getType () == ObjectStorageType::S3);
674+ && (storage_to_use ->getType () == ObjectStorageType::Azure
675+ || storage_to_use ->getType () == ObjectStorageType::S3);
669676 }
670677
671678 // / We need object metadata for two cases:
672679 // / 1. object size suggests whether we need to use prefetch
673680 // / 2. object etag suggests a cache key in case we use filesystem cache
674681 if (!object_info.metadata )
675- object_info.metadata = object_storage ->getObjectMetadata (object_info.getPath ());
682+ object_info.metadata = storage_to_use ->getObjectMetadata (object_info.getPath ());
676683
677684 const auto & object_size = object_info.metadata ->size_bytes ;
678685
@@ -710,9 +717,9 @@ std::unique_ptr<ReadBufferFromFileBase> StorageObjectStorageSource::createReadBu
710717 {
711718 const std::string path = object_info.getPath ();
712719 StoredObject object (path, " " , object_size);
713- auto read_buffer_creator = [object, nested_buffer_read_settings, object_storage ]()
720+ auto read_buffer_creator = [object, nested_buffer_read_settings, storage_to_use ]()
714721 {
715- return object_storage ->readObject (object, nested_buffer_read_settings);
722+ return storage_to_use ->readObject (object, nested_buffer_read_settings);
716723 };
717724
718725 impl = std::make_unique<ReadBufferFromDistributedCache>(
@@ -745,9 +752,9 @@ std::unique_ptr<ReadBufferFromFileBase> StorageObjectStorageSource::createReadBu
745752 const auto cache_key = FileCacheKey::fromKey (hash.get128 ());
746753 auto cache = FileCacheFactory::instance ().get (filesystem_cache_name);
747754
748- auto read_buffer_creator = [path = object_info.getPath (), object_size, modified_read_settings, object_storage ]()
755+ auto read_buffer_creator = [path = object_info.getPath (), object_size, modified_read_settings, storage_to_use ]()
749756 {
750- return object_storage ->readObject (StoredObject (path, " " , object_size), modified_read_settings);
757+ return storage_to_use ->readObject (StoredObject (path, " " , object_size), modified_read_settings);
751758 };
752759
753760 modified_read_settings.filesystem_cache_boundary_alignment = settings[Setting::filesystem_cache_boundary_alignment];
@@ -777,7 +784,7 @@ std::unique_ptr<ReadBufferFromFileBase> StorageObjectStorageSource::createReadBu
777784 }
778785
779786 if (!impl)
780- impl = object_storage ->readObject (StoredObject (object_info.getPath (), " " , object_size), modified_read_settings);
787+ impl = storage_to_use ->readObject (StoredObject (object_info.getPath (), " " , object_size), modified_read_settings);
781788
782789 if (!use_async_buffer)
783790 return impl;
@@ -1157,7 +1164,7 @@ StorageObjectStorageSource::ArchiveIterator::createArchiveReader(ObjectInfoPtr o
11571164 /* path_to_archive */ object_info->getPath (),
11581165 /* archive_read_function */ [=, this ]()
11591166 {
1160- return StorageObjectStorageSource::createReadBuffer (*object_info, object_storage, getContext (), log);
1167+ return StorageObjectStorageSource::createReadBuffer (*object_info, object_info-> getObjectStorage (). value_or ( object_storage) , getContext (), log);
11611168 },
11621169 /* archive_size */ size);
11631170}
@@ -1177,7 +1184,10 @@ ObjectInfoPtr StorageObjectStorageSource::ArchiveIterator::next(size_t processor
11771184 return {};
11781185
11791186 if (!archive_object->metadata )
1180- archive_object->metadata = object_storage->getObjectMetadata (archive_object->getPath ());
1187+ {
1188+ ObjectStoragePtr storage_to_use = archive_object->getObjectStorage ().value_or (object_storage);
1189+ archive_object->metadata = storage_to_use->getObjectMetadata (archive_object->getPath ());
1190+ }
11811191
11821192 archive_reader = createArchiveReader (archive_object);
11831193 file_enumerator = archive_reader->firstFile ();
@@ -1202,7 +1212,10 @@ ObjectInfoPtr StorageObjectStorageSource::ArchiveIterator::next(size_t processor
12021212 return {};
12031213
12041214 if (!archive_object->metadata )
1205- archive_object->metadata = object_storage->getObjectMetadata (archive_object->getPath ());
1215+ {
1216+ ObjectStoragePtr storage_to_use = archive_object->getObjectStorage ().value_or (object_storage);
1217+ archive_object->metadata = storage_to_use->getObjectMetadata (archive_object->getPath ());
1218+ }
12061219
12071220 archive_reader = createArchiveReader (archive_object);
12081221 if (!archive_reader->fileExists (path_in_archive))
0 commit comments