void StorageMerge::alter(const AlterCommands & params, const String & database_name, const String & table_name, const Context & context) { auto lock = lockStructureForAlter(); ColumnsDescription new_columns = getColumns(); params.apply(new_columns); context.getDatabase(database_name)->alterTable(context, table_name, new_columns, {}); setColumns(new_columns); }
void StorageDistributed::alter(const AlterCommands & params, const String & database_name, const String & table_name, const Context & context) { for (const auto & param : params) if (param.type == AlterCommand::MODIFY_PRIMARY_KEY) throw Exception("Storage engine " + getName() + " doesn't support primary key.", ErrorCodes::NOT_IMPLEMENTED); auto lock = lockStructureForAlter(); params.apply(*columns, materialized_columns, alias_columns, column_defaults); context.getDatabase(database_name)->alterTable( context, table_name, *columns, materialized_columns, alias_columns, column_defaults, {}); }
void InterpreterAlterQuery::parseAlter( const ASTAlterQuery::ParameterContainer & params_container, AlterCommands & out_alter_commands, PartitionCommands & out_partition_commands, MutationCommands & out_mutation_commands) { const DataTypeFactory & data_type_factory = DataTypeFactory::instance(); for (const auto & params : params_container) { if (params.type == ASTAlterQuery::ADD_COLUMN) { AlterCommand command; command.type = AlterCommand::ADD_COLUMN; const auto & ast_col_decl = typeid_cast<const ASTColumnDeclaration &>(*params.col_decl); command.column_name = ast_col_decl.name; if (ast_col_decl.type) { command.data_type = data_type_factory.get(ast_col_decl.type); } if (ast_col_decl.default_expression) { command.default_kind = columnDefaultKindFromString(ast_col_decl.default_specifier); command.default_expression = ast_col_decl.default_expression; } if (params.column) command.after_column = typeid_cast<const ASTIdentifier &>(*params.column).name; out_alter_commands.emplace_back(std::move(command)); } else if (params.type == ASTAlterQuery::DROP_COLUMN) { if (params.partition) { if (!params.clear_column) throw Exception("Can't DROP COLUMN from partition. It is possible only CLEAR COLUMN in partition", ErrorCodes::BAD_ARGUMENTS); const Field & column_name = typeid_cast<const ASTIdentifier &>(*(params.column)).name; out_partition_commands.emplace_back(PartitionCommand::clearColumn(params.partition, column_name)); } else { if (params.clear_column) throw Exception("\"ALTER TABLE table CLEAR COLUMN column\" queries are not supported yet. Use \"CLEAR COLUMN column IN PARTITION\".", ErrorCodes::NOT_IMPLEMENTED); AlterCommand command; command.type = AlterCommand::DROP_COLUMN; command.column_name = typeid_cast<const ASTIdentifier &>(*(params.column)).name; out_alter_commands.emplace_back(std::move(command)); } } else if (params.type == ASTAlterQuery::MODIFY_COLUMN) { AlterCommand command; command.type = AlterCommand::MODIFY_COLUMN; const auto & ast_col_decl = typeid_cast<const ASTColumnDeclaration &>(*params.col_decl); command.column_name = ast_col_decl.name; if (ast_col_decl.type) { command.data_type = data_type_factory.get(ast_col_decl.type); } if (ast_col_decl.default_expression) { command.default_kind = columnDefaultKindFromString(ast_col_decl.default_specifier); command.default_expression = ast_col_decl.default_expression; } out_alter_commands.emplace_back(std::move(command)); } else if (params.type == ASTAlterQuery::MODIFY_PRIMARY_KEY) { AlterCommand command; command.type = AlterCommand::MODIFY_PRIMARY_KEY; command.primary_key = params.primary_key; out_alter_commands.emplace_back(std::move(command)); } else if (params.type == ASTAlterQuery::DROP_PARTITION) { out_partition_commands.emplace_back(PartitionCommand::dropPartition(params.partition, params.detach)); } else if (params.type == ASTAlterQuery::ATTACH_PARTITION) { out_partition_commands.emplace_back(PartitionCommand::attachPartition(params.partition, params.part)); } else if (params.type == ASTAlterQuery::REPLACE_PARTITION) { out_partition_commands.emplace_back( PartitionCommand::replacePartition(params.partition, params.replace, params.from_database, params.from_table)); } else if (params.type == ASTAlterQuery::FETCH_PARTITION) { out_partition_commands.emplace_back(PartitionCommand::fetchPartition(params.partition, params.from)); } else if (params.type == ASTAlterQuery::FREEZE_PARTITION) { out_partition_commands.emplace_back(PartitionCommand::freezePartition(params.partition, params.with_name)); } else if (params.type == ASTAlterQuery::DELETE) { out_mutation_commands.commands.emplace_back(MutationCommand::delete_(params.predicate)); } else throw Exception("Wrong parameter type in ALTER query", ErrorCodes::LOGICAL_ERROR); } }