From d680a7f8daff885a0a868aff628dac72d6d8e7ed Mon Sep 17 00:00:00 2001 From: Alexey Milovidov Date: Tue, 17 May 2016 04:17:32 +0300 Subject: [PATCH] Alter primary key: development [#METR-21119]. --- dbms/include/DB/Databases/IDatabase.h | 2 +- dbms/src/Storages/StorageMergeTree.cpp | 12 +++++++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/dbms/include/DB/Databases/IDatabase.h b/dbms/include/DB/Databases/IDatabase.h index 3d7ce82f933..9b711f3ef83 100644 --- a/dbms/include/DB/Databases/IDatabase.h +++ b/dbms/include/DB/Databases/IDatabase.h @@ -79,7 +79,7 @@ public: const NamesAndTypesList & materialized_columns, const NamesAndTypesList & alias_columns, const ColumnDefaults & column_defaults, - const ASTModifier & engine_modifier); + const ASTModifier & engine_modifier) = 0; /// Получить запрос CREATE TABLE для таблицы. Может выдавать информацию и для detached таблиц, для которых есть метаданные. virtual ASTPtr getCreateQuery(const String & name) const = 0; diff --git a/dbms/src/Storages/StorageMergeTree.cpp b/dbms/src/Storages/StorageMergeTree.cpp index 8d41055c5a1..b4932d3bcb9 100644 --- a/dbms/src/Storages/StorageMergeTree.cpp +++ b/dbms/src/Storages/StorageMergeTree.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include @@ -211,7 +212,16 @@ void StorageMergeTree::alter( context.getDatabase(database_name)->alterTable( context, table_name, new_columns, new_materialized_columns, new_alias_columns, new_column_defaults, - [&new_primary_key_ast] (ASTPtr & primary_key_ast) { primary_key_ast = new_primary_key_ast; }); + [&new_primary_key_ast] (ASTPtr & engine_ast) + { + ASTFunction * tuple = new ASTFunction(new_primary_key_ast->range); + tuple->name = "tuple"; + tuple->arguments = new_primary_key_ast; + tuple->children.push_back(tuple->arguments); + + /// Первичный ключ находится на втором месте в описании движка таблицы и может быть представлен в виде кортежа. + typeid_cast(*typeid_cast(*engine_ast).arguments).children.at(1) = tuple; + }); materialized_columns = new_materialized_columns; alias_columns = new_alias_columns;