@@ -30,12 +30,15 @@ class MemorySource : public ISource
3030 std::shared_ptr<std::atomic<size_t >> parallel_execution_index_,
3131 InitializerFunc initializer_func_ = {})
3232 : ISource(storage_snapshot->getSampleBlockForColumns (column_names_))
33- , column_names_and_types (storage_snapshot->getColumnsByNames (
33+ , requested_column_names_and_types (storage_snapshot->getColumnsByNames (
3434 GetColumnsOptions (GetColumnsOptions::All).withSubcolumns().withExtendedObjects(), column_names_))
3535 , data(data_)
3636 , parallel_execution_index(parallel_execution_index_)
3737 , initializer_func(std::move(initializer_func_))
3838 {
39+ auto all_column_names_and_types = storage_snapshot->getColumns (GetColumnsOptions (GetColumnsOptions::All).withSubcolumns ().withExtendedObjects ());
40+ for (const auto & [name, type] : all_column_names_and_types)
41+ all_names_to_types[name] = type;
3942 }
4043
4144 String getName () const override { return " Memory" ; }
@@ -59,17 +62,20 @@ class MemorySource : public ISource
5962 const Block & src = (*data)[current_index];
6063
6164 Columns columns;
62- size_t num_columns = column_names_and_types .size ();
65+ size_t num_columns = requested_column_names_and_types .size ();
6366 columns.reserve (num_columns);
6467
65- auto name_and_type = column_names_and_types .begin ();
68+ auto name_and_type = requested_column_names_and_types .begin ();
6669 for (size_t i = 0 ; i < num_columns; ++i)
6770 {
68- columns.emplace_back (tryGetColumnFromBlock (src, *name_and_type));
71+ if (name_and_type->isSubcolumn ())
72+ columns.emplace_back (tryGetSubcolumnFromBlock (src, all_names_to_types[name_and_type->getNameInStorage ()], *name_and_type));
73+ else
74+ columns.emplace_back (tryGetColumnFromBlock (src, *name_and_type));
6975 ++name_and_type;
7076 }
7177
72- fillMissingColumns (columns, src.rows (), column_names_and_types, column_names_and_types , {}, nullptr );
78+ fillMissingColumns (columns, src.rows (), requested_column_names_and_types, requested_column_names_and_types , {}, nullptr );
7379 assert (std::all_of (columns.begin (), columns.end (), [](const auto & column) { return column != nullptr ; }));
7480
7581 return Chunk (std::move (columns), src.rows ());
@@ -88,7 +94,9 @@ class MemorySource : public ISource
8894 }
8995 }
9096
91- const NamesAndTypesList column_names_and_types;
97+ const NamesAndTypesList requested_column_names_and_types;
98+ // / Map (name -> type) for all columns from the storage header.
99+ std::unordered_map<String, DataTypePtr> all_names_to_types;
92100 size_t execution_index = 0 ;
93101 std::shared_ptr<const Blocks> data;
94102 std::shared_ptr<std::atomic<size_t >> parallel_execution_index;
0 commit comments