mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-22 15:42:02 +00:00
Merge
This commit is contained in:
commit
8dea64dc18
@ -184,7 +184,9 @@ private:
|
||||
auto discard_prev = true;
|
||||
|
||||
/// either insert or merge new element
|
||||
const auto insert_or_sum = [&] (const auto & pos, const auto & key_array, auto && val_getter) {
|
||||
const auto insert_or_sum = [&] (std::size_t & index, const std::vector<std::size_t> & key_pos,
|
||||
const auto & key_array, auto && val_getter) {
|
||||
const auto pos = key_pos[index++];
|
||||
const auto & key = key_array[pos];
|
||||
|
||||
if (discard_prev)
|
||||
@ -216,20 +218,20 @@ private:
|
||||
}
|
||||
};
|
||||
|
||||
std::size_t pos_lhs = 0;
|
||||
std::size_t pos_rhs = 0;
|
||||
std::size_t index_lhs = 0;
|
||||
std::size_t index_rhs = 0;
|
||||
|
||||
/// perform 2-way merge
|
||||
while (true)
|
||||
if (pos_lhs < key_pos_lhs.size() && pos_rhs == key_pos_rhs.size())
|
||||
insert_or_sum(key_pos_lhs[pos_lhs++], key_array_lhs, val_getter_lhs);
|
||||
else if (pos_lhs == key_pos_lhs.size() && pos_rhs < key_pos_rhs.size())
|
||||
insert_or_sum(key_pos_rhs[pos_rhs++], key_array_rhs, val_getter_rhs);
|
||||
else if (pos_lhs < key_pos_lhs.size() && pos_rhs < key_pos_rhs.size())
|
||||
if (key_array_lhs[key_pos_lhs[pos_lhs]] < key_array_rhs[key_pos_rhs[pos_rhs]])
|
||||
insert_or_sum(key_pos_lhs[pos_lhs++], key_array_lhs, val_getter_lhs);
|
||||
if (index_lhs < key_pos_lhs.size() && index_rhs == key_pos_rhs.size())
|
||||
insert_or_sum(index_lhs, key_pos_lhs, key_array_lhs, val_getter_lhs);
|
||||
else if (index_lhs == key_pos_lhs.size() && index_rhs < key_pos_rhs.size())
|
||||
insert_or_sum(index_rhs, key_pos_rhs, key_array_rhs, val_getter_rhs);
|
||||
else if (index_lhs < key_pos_lhs.size() && index_rhs < key_pos_rhs.size())
|
||||
if (key_array_lhs[key_pos_lhs[index_lhs]] < key_array_rhs[key_pos_rhs[index_rhs]])
|
||||
insert_or_sum(index_lhs, key_pos_lhs, key_array_lhs, val_getter_lhs);
|
||||
else
|
||||
insert_or_sum(key_pos_rhs[pos_rhs++], key_array_rhs, val_getter_rhs);
|
||||
insert_or_sum(index_rhs, key_pos_rhs, key_array_rhs, val_getter_rhs);
|
||||
else
|
||||
break;
|
||||
|
||||
|
@ -115,7 +115,15 @@ void InterpreterRenameQuery::execute()
|
||||
|
||||
/// Уведомляем таблицу о том, что она переименовывается. Если таблица не поддерживает переименование - кинется исключение.
|
||||
StoragePtr table = context.getTable(elem.from_database_name, elem.from_table_name);
|
||||
table->rename(path + "data/" + elem.to_database_name_escaped + "/", elem.to_database_name, elem.to_table_name);
|
||||
try
|
||||
{
|
||||
table->rename(path + "data/" + elem.to_database_name_escaped + "/", elem.to_database_name,
|
||||
elem.to_table_name);
|
||||
}
|
||||
catch (const Poco::Exception & e)
|
||||
{
|
||||
throw Exception{e};
|
||||
}
|
||||
|
||||
/// Пишем новый файл с метаданными.
|
||||
{
|
||||
|
@ -362,6 +362,12 @@ void MergeTreeData::setPath(const String & new_full_path, bool move_data)
|
||||
{
|
||||
if (move_data)
|
||||
{
|
||||
if (Poco::File{new_full_path}.exists())
|
||||
throw Exception{
|
||||
"Target path already exists: " + new_full_path,
|
||||
/// @todo existing target can also be a file, not directory
|
||||
ErrorCodes::DIRECTORY_ALREADY_EXISTS
|
||||
};
|
||||
Poco::File(full_path).renameTo(new_full_path);
|
||||
/// Если данные перемещать не нужно, значит их переместил кто-то другой. Расчитываем, что он еще и сбросил кеши.
|
||||
context.resetCaches();
|
||||
|
Loading…
Reference in New Issue
Block a user