This commit is contained in:
Alexey Milovidov 2014-11-25 23:55:34 +03:00
parent 8b2b1a52d1
commit 25ddd55cad

View File

@ -75,11 +75,9 @@ public:
/// Указатели на столбцы смещений, общие для столбцов из вложенных структур данных
/// Если append, все значения nullptr, и offset_columns используется только для проверки, что столбец смещений уже прочитан.
OffsetColumns offset_columns;
for (const NameAndTypePair & it : columns)
{
const auto read_column = [&] (const NameAndTypePair & it) {
if (streams.end() == streams.find(it.name))
continue;
return;
all_columns_missing = false;
@ -100,7 +98,7 @@ public:
String name = DataTypeNested::extractNestedTableName(column.name);
if (offset_columns.count(name) == 0)
offset_columns[name] = append ? NULL : new ColumnArray::ColumnOffsets_t;
offset_columns[name] = append ? nullptr : new ColumnArray::ColumnOffsets_t;
else
read_offsets = false; /// на предыдущих итерациях смещения уже считали вызовом readData
@ -114,10 +112,17 @@ public:
if (!append && column.column->size())
res.insert(column);
}
};
for (const NameAndTypePair & it : columns)
read_column(it);
if (all_columns_missing)
addMinimumSizeColumn(from_mark, max_rows_to_read, res);
{
addMinimumSizeColumn();
/// minimum size column is necessarily at list's front
read_column(columns.front());
}
}
catch (const Exception & e)
{
@ -136,7 +141,7 @@ public:
}
}
void addMinimumSizeColumn(const size_t from_mark, const size_t max_rows_to_read, Block & res)
void addMinimumSizeColumn()
{
const auto get_column_size = [this] (const String & name) {
const auto & files = data_part->checksums.files;
@ -168,17 +173,8 @@ public:
if (!minimum_size_column)
throw std::logic_error{"could not find a column of minimum size in MergeTree"};
ColumnWithNameAndType column{
minimum_size_column->type->createColumn(),
minimum_size_column->type,
minimum_size_column->name
};
addStream(column.name, *column.type, all_mark_ranges);
addStream(minimum_size_column->name, *minimum_size_column->type, all_mark_ranges);
columns.emplace(std::begin(columns), *minimum_size_column);
res.insert(column);
readData(column.name, *column.type, *column.column, from_mark, max_rows_to_read, 0, true);
}
/// Заполняет столбцы, которых нет в блоке, значениями по умолчанию.