diff --git a/src/Interpreters/MutationsInterpreter.cpp b/src/Interpreters/MutationsInterpreter.cpp index 1059e1fdae5..25bb3fc5e82 100644 --- a/src/Interpreters/MutationsInterpreter.cpp +++ b/src/Interpreters/MutationsInterpreter.cpp @@ -532,55 +532,12 @@ void MutationsInterpreter::prepare(bool dry_run) validateUpdateColumns(source, metadata_snapshot, updated_columns, column_to_affected_materialized); } - for (const auto & [_, names] : column_to_affected_materialized) - updated_columns.insert(names.begin(), names.end()); - std::function has_index_or_projection = [&](const String & file_name) { return source.hasIndexOrProjection(file_name); }; if (settings.recalculate_dependencies_of_updated_columns) dependencies = getAllColumnDependencies(metadata_snapshot, updated_columns, has_index_or_projection); - for (const auto & index : metadata_snapshot->getSecondaryIndices()) - { - if (source.hasIndexOrProjection("skp_idx_" + index.name + ".idx") || source.hasIndexOrProjection("skp_idx_" + index.name + ".idx2")) - { - // If some dependent columns gets mutated - bool mutate = false; - const auto & index_cols = index.expression->getRequiredColumns(); - for (const auto & col : index_cols) - { - if (updated_columns.contains(col)) - { - mutate = true; - break; - } - } - if (mutate) - materialized_indices.insert(index.name); - } - } - - for (const auto & projection : metadata_snapshot->getProjections()) - { - if (source.hasIndexOrProjection(projection.getDirectoryName())) - { - // If some dependent columns gets mutated - bool mutate = false; - const auto & projection_cols = projection.required_columns; - for (const auto & col : projection_cols) - { - if (updated_columns.contains(col)) - { - mutate = true; - break; - } - } - if (mutate) - materialized_projections.insert(projection.name); - } - } - std::vector read_columns; /// First, break a sequence of commands into stages. for (auto & command : commands) @@ -869,6 +826,31 @@ void MutationsInterpreter::prepare(bool dry_run) for (const auto & column : changed_columns) stages.back().column_to_updated.emplace( column, std::make_shared(column)); + + for (const auto & index : metadata_snapshot->getSecondaryIndices()) + { + if (source.hasIndexOrProjection("skp_idx_" + index.name + ".idx") + || source.hasIndexOrProjection("skp_idx_" + index.name + ".idx2")) + { + const auto & index_cols = index.expression->getRequiredColumns(); + bool changed = std::any_of( + index_cols.begin(), index_cols.end(), [&](const auto & col) { return changed_columns.contains(col); }); + if (changed) + materialized_indices.insert(index.name); + } + } + + for (const auto & projection : metadata_snapshot->getProjections()) + { + if (source.hasIndexOrProjection(projection.getDirectoryName())) + { + const auto & projection_cols = projection.required_columns; + bool changed = std::any_of( + projection_cols.begin(), projection_cols.end(), [&](const auto & col) { return changed_columns.contains(col); }); + if (changed) + materialized_projections.insert(projection.name); + } + } } if (!unchanged_columns.empty()) diff --git a/src/Storages/MergeTree/MutateTask.cpp b/src/Storages/MergeTree/MutateTask.cpp index d65897ac97d..7031027002d 100644 --- a/src/Storages/MergeTree/MutateTask.cpp +++ b/src/Storages/MergeTree/MutateTask.cpp @@ -1269,22 +1269,23 @@ private: continue; if (ctx->materialized_indices.contains(idx.name)) - skip_indices.push_back(MergeTreeIndexFactory::instance().get(idx)); - - auto hardlink_index = [&](const String & idx_name) { - if (ctx->source_part->checksums.has(idx_name)) + skip_indices.push_back(MergeTreeIndexFactory::instance().get(idx)); + } + else + { + auto prefix = fmt::format("{}{}.", INDEX_FILE_PREFIX, idx.name); + auto it = ctx->source_part->checksums.files.upper_bound(prefix); + while (it != ctx->source_part->checksums.files.end()) { - auto it = ctx->source_part->checksums.files.find(idx_name); - if (it != ctx->source_part->checksums.files.end()) - { - entries_to_hardlink.insert(idx_name); - ctx->existing_indices_checksums.addFile(idx_name, it->second.file_size, it->second.file_hash); - } + if (!startsWith(it->first, prefix)) + break; + + entries_to_hardlink.insert(it->first); + ctx->existing_indices_checksums.addFile(it->first, it->second.file_size, it->second.file_hash); + ++it; } - }; - hardlink_index(INDEX_FILE_PREFIX + idx.name + ".idx"); - hardlink_index(INDEX_FILE_PREFIX + idx.name + ".idx2"); + } } NameSet removed_projections; @@ -1301,10 +1302,14 @@ private: continue; if (ctx->materialized_projections.contains(projection.name)) + { ctx->projections_to_build.push_back(&projection); - - if (ctx->source_part->checksums.has(projection.getDirectoryName())) - entries_to_hardlink.insert(projection.getDirectoryName()); + } + else + { + if (ctx->source_part->checksums.has(projection.getDirectoryName())) + entries_to_hardlink.insert(projection.getDirectoryName()); + } } NameSet hardlinked_files; @@ -1354,7 +1359,7 @@ private: if (ctx->metadata_snapshot->hasPrimaryKey() || ctx->metadata_snapshot->hasSecondaryIndices()) { builder.addTransform(std::make_shared( - builder.getHeader(), ctx->data->getPrimaryKeyAndSkipIndicesExpression(ctx->metadata_snapshot, skip_indices))); + builder.getHeader(), ctx->data->getPrimaryKeyAndSkipIndicesExpression(ctx->metadata_snapshot, skip_indices))); builder.addTransform(std::make_shared(builder.getHeader())); }