This commit is contained in:
Alexey Arno 2015-04-13 19:02:53 +03:00
commit 8dea64dc18
3 changed files with 28 additions and 12 deletions

View File

@ -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;

View File

@ -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};
}
/// Пишем новый файл с метаданными.
{

View File

@ -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();