mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-26 17:41:59 +00:00
Merge
This commit is contained in:
parent
29e85b5fbc
commit
67b76568d3
@ -465,9 +465,6 @@ public:
|
||||
/// Переименовывает временные файлы, завершая ALTER куска.
|
||||
void commit();
|
||||
|
||||
/// Проверяет, сделаны ли какие-то изменения.
|
||||
bool operator !() const { return !data_part; }
|
||||
|
||||
/// Если не был вызван commit(), удаляет временные файлы, отменяя ALTER куска.
|
||||
~AlterDataPartTransaction();
|
||||
|
||||
@ -614,8 +611,10 @@ public:
|
||||
|
||||
/** Выполняет ALTER куска данных, записывает результат во временные файлы.
|
||||
* Возвращает объект, позволяющий переименовать временные файлы в постоянные.
|
||||
* Если измененных столбцов подозрительно много, и !skip_sanity_checks, бросает исключение.
|
||||
* Если никаких действий над данными не требуется, возвращает nullptr.
|
||||
*/
|
||||
AlterDataPartTransactionPtr alterDataPart(DataPartPtr part, const NamesAndTypesList & new_columns);
|
||||
AlterDataPartTransactionPtr alterDataPart(DataPartPtr part, const NamesAndTypesList & new_columns, bool skip_sanity_checks = false);
|
||||
|
||||
/// Нужно вызывать под залоченным lockStructureForAlter().
|
||||
void setColumnsList(const NamesAndTypesList & new_columns) { columns = new NamesAndTypesList(new_columns); }
|
||||
|
@ -419,16 +419,24 @@ void MergeTreeData::createConvertExpression(DataPartPtr part, const NamesAndType
|
||||
}
|
||||
}
|
||||
|
||||
MergeTreeData::AlterDataPartTransactionPtr MergeTreeData::alterDataPart(DataPartPtr part, const NamesAndTypesList & new_columns)
|
||||
MergeTreeData::AlterDataPartTransactionPtr MergeTreeData::alterDataPart(DataPartPtr part, const NamesAndTypesList & new_columns, bool skip_sanity_checks)
|
||||
{
|
||||
ExpressionActionsPtr expression;
|
||||
AlterDataPartTransactionPtr transaction(new AlterDataPartTransaction(part));
|
||||
createConvertExpression(part, part->columns, new_columns, expression, transaction->rename_map);
|
||||
|
||||
if (!skip_sanity_checks && transaction->rename_map.size() > 5)
|
||||
{
|
||||
transaction->clear();
|
||||
|
||||
throw Exception("Suspiciously many (" + toString(transaction->rename_map.size()) + ") files need to be modified in part " + part->name
|
||||
+ ". Aborting just in case");
|
||||
}
|
||||
|
||||
if (transaction->rename_map.empty())
|
||||
{
|
||||
transaction->clear();
|
||||
return transaction;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
DataPart::Checksums add_checksums;
|
||||
|
@ -119,7 +119,9 @@ void StorageMergeTree::alter(const AlterCommands & params, const String & databa
|
||||
std::vector<MergeTreeData::AlterDataPartTransactionPtr> transactions;
|
||||
for (MergeTreeData::DataPartPtr part : parts)
|
||||
{
|
||||
transactions.push_back(data.alterDataPart(part, new_columns));
|
||||
auto transaction = data.alterDataPart(part, new_columns);
|
||||
if (transaction)
|
||||
transactions.push_back(std::move(transaction));
|
||||
}
|
||||
|
||||
auto table_hard_lock = lockStructureForAlter();
|
||||
|
@ -1172,6 +1172,7 @@ void StorageReplicatedMergeTree::alterThread()
|
||||
for (const MergeTreeData::DataPartPtr & part : parts)
|
||||
{
|
||||
/// Обновим кусок и запишем результат во временные файлы.
|
||||
/// TODO: Можно пропускать проверку на слишком большие изменения, если в ZooKeeper есть, например, нода /flags/force_alter.
|
||||
auto transaction = data.alterDataPart(part, columns);
|
||||
|
||||
if (!transaction)
|
||||
|
Loading…
Reference in New Issue
Block a user