diff --git a/dbms/include/DB/DataStreams/SummingSortedBlockInputStream.h b/dbms/include/DB/DataStreams/SummingSortedBlockInputStream.h index 4f858a347b4..cb60650429d 100644 --- a/dbms/include/DB/DataStreams/SummingSortedBlockInputStream.h +++ b/dbms/include/DB/DataStreams/SummingSortedBlockInputStream.h @@ -63,13 +63,13 @@ private: Names column_names_to_sum; /// Если задано - преобразуется в column_numbers_to_sum при инициализации. ColumnNumbers column_numbers_to_sum; - /** Таблица может вложенные таблицы, обрабатываемые особым образом. - * Если название вложенной таблицы заканчинвается на `Map` и она содержит ровно два столбца, + /** Таблица может иметь вложенные таблицы, обрабатываемые особым образом. + * Если название вложенной таблицы заканчинвается на `Map` и она содержит не менее двух столбцов, * удовлетворяющих следующим критериям: * - первый столбец - числовой ((U)IntN, Date, DateTime), назовем его условно key, - * - второй столбец - арифметический ((U)IntN, Float32/64), условно value. - * Такая вложенная таблица воспринимается как отображение key => value и при слиянии - * ее строк выполняется слияние элементов двух множеств по key со сложением по value. + * - остальные столбцы - арифметические ((U)IntN, Float32/64), условно (values...). + * Такая вложенная таблица воспринимается как отображение key => (values...) и при слиянии + * ее строк выполняется слияние элементов двух множеств по key со сложением соответствующих (values...). * Пример: * [(1, 100)] + [(2, 150)] -> [(1, 100), (2, 150)] * [(1, 100)] + [(1, 150)] -> [(1, 250)] @@ -77,7 +77,7 @@ private: * [(1, 100), (2, 150)] + [(1, -100)] -> [(2, 150)] */ - /// Хранит номера столбца-ключа и столбца-значения + /// Хранит номера столбца-ключа и столбцов-значений struct map_description { std::size_t key_col_num; diff --git a/dbms/src/DataStreams/SummingSortedBlockInputStream.cpp b/dbms/src/DataStreams/SummingSortedBlockInputStream.cpp index 82fe5b540d9..5e1244bb4fe 100644 --- a/dbms/src/DataStreams/SummingSortedBlockInputStream.cpp +++ b/dbms/src/DataStreams/SummingSortedBlockInputStream.cpp @@ -98,11 +98,11 @@ Block SummingSortedBlockInputStream::readImpl() /// select actual nested Maps from list of candidates for (const auto & map : discovered_maps) { - /// map can only contain a pair of elements (key -> value) + /// map should contain at least two elements (key -> value) if (map.second.size() < 2) continue; - /// check types of key and value + /// check type of key const auto key_num = map.second.front(); auto & key_col = merged_block.getByPosition(key_num); /// skip maps, whose members are part of primary key diff --git a/dbms/tests/queries/0_stateless/00148_summing_merge_tree_nested_map_multiple_values.reference b/dbms/tests/queries/0_stateless/00148_summing_merge_tree_nested_map_multiple_values.reference index e69de29bb2d..1d46d31bc9e 100644 --- a/dbms/tests/queries/0_stateless/00148_summing_merge_tree_nested_map_multiple_values.reference +++ b/dbms/tests/queries/0_stateless/00148_summing_merge_tree_nested_map_multiple_values.reference @@ -0,0 +1,7 @@ +0 [1,2] [100,150] [1,-2.5] +1 [1] [250] [0] +2 [1,2] [250,150] [3.5,3.5] +3 [2] [150] [1.5] +0 [1] [1] ['2015-04-09'] [1] [100] +0 [1] [1] ['2015-04-08'] [1] [200] +0 [1] [1] ['2015-04-09'] [1] [100]