#include namespace DB { StorageInMemoryMetadata::StorageInMemoryMetadata( const ColumnsDescription & columns_, const IndicesDescription & secondary_indices_, const ConstraintsDescription & constraints_) : columns(columns_) , secondary_indices(secondary_indices_) , constraints(constraints_) { } StorageInMemoryMetadata::StorageInMemoryMetadata(const StorageInMemoryMetadata & other) : columns(other.columns) , secondary_indices(other.secondary_indices) , constraints(other.constraints) , partition_key(other.partition_key) , primary_key(other.primary_key) , sorting_key(other.sorting_key) , sampling_key(other.sampling_key) , column_ttls_by_name(other.column_ttls_by_name) , table_ttl(other.table_ttl) , settings_changes(other.settings_changes ? other.settings_changes->clone() : nullptr) , select(other.select) { } StorageInMemoryMetadata & StorageInMemoryMetadata::operator=(const StorageInMemoryMetadata & other) { if (&other == this) return *this; columns = other.columns; secondary_indices = other.secondary_indices; constraints = other.constraints; partition_key = other.partition_key; primary_key = other.primary_key; sorting_key = other.sorting_key; sampling_key = other.sampling_key; column_ttls_by_name = other.column_ttls_by_name; table_ttl = other.table_ttl; if (other.settings_changes) settings_changes = other.settings_changes->clone(); else settings_changes.reset(); select = other.select; return *this; } void StorageInMemoryMetadata::setColumns(ColumnsDescription columns_) { columns = std::move(columns_); } void StorageInMemoryMetadata::setSecondaryIndices(IndicesDescription secondary_indices_) { secondary_indices = std::move(secondary_indices_); } void StorageInMemoryMetadata::setConstraints(ConstraintsDescription constraints_) { constraints = std::move(constraints_); } void StorageInMemoryMetadata::setTableTTLs(const TTLTableDescription & table_ttl_) { table_ttl = table_ttl_; } void StorageInMemoryMetadata::setColumnTTLs(const TTLColumnsDescription & column_ttls_by_name_) { column_ttls_by_name = column_ttls_by_name_; } void StorageInMemoryMetadata::setSettingsChanges(const ASTPtr & settings_changes_) { if (settings_changes_) settings_changes = settings_changes_; else settings_changes = nullptr; } void StorageInMemoryMetadata::setSelectQuery(const SelectQueryDescription & select_) { select = select_; } const ColumnsDescription & StorageInMemoryMetadata::getColumns() const { return columns; } const IndicesDescription & StorageInMemoryMetadata::getSecondaryIndices() const { return secondary_indices; } bool StorageInMemoryMetadata::hasSecondaryIndices() const { return !secondary_indices.empty(); } const ConstraintsDescription & StorageInMemoryMetadata::getConstraints() const { return constraints; } TTLTableDescription StorageInMemoryMetadata::getTableTTLs() const { return table_ttl; } bool StorageInMemoryMetadata::hasAnyTableTTL() const { return hasAnyMoveTTL() || hasRowsTTL(); } TTLColumnsDescription StorageInMemoryMetadata::getColumnTTLs() const { return column_ttls_by_name; } bool StorageInMemoryMetadata::hasAnyColumnTTL() const { return !column_ttls_by_name.empty(); } TTLDescription StorageInMemoryMetadata::getRowsTTL() const { return table_ttl.rows_ttl; } bool StorageInMemoryMetadata::hasRowsTTL() const { return table_ttl.rows_ttl.expression != nullptr; } TTLDescriptions StorageInMemoryMetadata::getMoveTTLs() const { return table_ttl.move_ttl; } bool StorageInMemoryMetadata::hasAnyMoveTTL() const { return !table_ttl.move_ttl.empty(); } ColumnDependencies StorageInMemoryMetadata::getColumnDependencies(const NameSet & updated_columns) const { if (updated_columns.empty()) return {}; ColumnDependencies res; NameSet indices_columns; NameSet required_ttl_columns; NameSet updated_ttl_columns; auto add_dependent_columns = [&updated_columns](const auto & expression, auto & to_set) { auto requiered_columns = expression->getRequiredColumns(); for (const auto & dependency : requiered_columns) { if (updated_columns.count(dependency)) { to_set.insert(requiered_columns.begin(), requiered_columns.end()); return true; } } return false; }; for (const auto & index : getSecondaryIndices()) add_dependent_columns(index.expression, indices_columns); if (hasRowsTTL()) { auto rows_expression = getRowsTTL().expression; if (add_dependent_columns(rows_expression, required_ttl_columns)) { /// Filter all columns, if rows TTL expression have to be recalculated. for (const auto & column : getColumns().getAllPhysical()) updated_ttl_columns.insert(column.name); } } for (const auto & [name, entry] : getColumnTTLs()) { if (add_dependent_columns(entry.expression, required_ttl_columns)) updated_ttl_columns.insert(name); } for (const auto & entry : getMoveTTLs()) add_dependent_columns(entry.expression, required_ttl_columns); for (const auto & column : indices_columns) res.emplace(column, ColumnDependency::SKIP_INDEX); for (const auto & column : required_ttl_columns) res.emplace(column, ColumnDependency::TTL_EXPRESSION); for (const auto & column : updated_ttl_columns) res.emplace(column, ColumnDependency::TTL_TARGET); return res; } Block StorageInMemoryMetadata::getSampleBlockNonMaterialized() const { Block res; for (const auto & column : getColumns().getOrdinary()) res.insert({column.type->createColumn(), column.type, column.name}); return res; } }