diff --git a/dbms/src/Parsers/ASTAlterQuery.cpp b/dbms/src/Parsers/ASTAlterQuery.cpp index 7081b5122474ecddb34240a949a367cf1d94f84d..7bed86d7dcbe8913bb25a88f1039398beb38e996 100644 --- a/dbms/src/Parsers/ASTAlterQuery.cpp +++ b/dbms/src/Parsers/ASTAlterQuery.cpp @@ -30,6 +30,11 @@ ASTPtr ASTAlterCommand::clone() const res->primary_key = primary_key->clone(); res->children.push_back(res->primary_key); } + if (sorting_key) + { + res->sorting_key = sorting_key->clone(); + res->children.push_back(res->sorting_key); + } if (partition) { res->partition = partition->clone(); @@ -84,6 +89,13 @@ void ASTAlterCommand::formatImpl( primary_key->formatImpl(settings, state, frame); settings.ostr << ")"; } + else if (type == ASTAlterCommand::MODIFY_ORDER_BY) + { + settings.ostr << (settings.hilite ? hilite_keyword : "") << indent_str << "MODIFY ORDER BY " << (settings.hilite ? hilite_none : ""); + settings.ostr << "("; + sorting_key->formatImpl(settings, state, frame); + settings.ostr << ")"; + } else if (type == ASTAlterCommand::DROP_PARTITION) { settings.ostr << (settings.hilite ? hilite_keyword : "") << indent_str << (detach ? "DETACH" : "DROP") << " PARTITION " diff --git a/dbms/src/Parsers/ASTAlterQuery.h b/dbms/src/Parsers/ASTAlterQuery.h index c79f9ba8b2f8974749510068fcf9e621e560d2bc..8aeee01b03592e03d114c4a372e7b1ca1e201708 100644 --- a/dbms/src/Parsers/ASTAlterQuery.h +++ b/dbms/src/Parsers/ASTAlterQuery.h @@ -25,6 +25,7 @@ public: DROP_COLUMN, MODIFY_COLUMN, MODIFY_PRIMARY_KEY, + MODIFY_ORDER_BY, DROP_PARTITION, ATTACH_PARTITION, @@ -55,6 +56,10 @@ public: */ ASTPtr primary_key; + /** For MODIFY ORDER BY + */ + ASTPtr sorting_key; + /** Used in DROP PARTITION and ATTACH PARTITION FROM queries. * The value or ID of the partition is stored here. */ diff --git a/dbms/src/Parsers/ParserAlterQuery.cpp b/dbms/src/Parsers/ParserAlterQuery.cpp index 56eaddb38eed554d48eed72cc5abc1c09950706b..619755a7800e43729475fdb0272e08f9623d584a 100644 --- a/dbms/src/Parsers/ParserAlterQuery.cpp +++ b/dbms/src/Parsers/ParserAlterQuery.cpp @@ -24,6 +24,7 @@ bool ParserAlterCommand::parseImpl(Pos & pos, ASTPtr & node, Expected & expected ParserKeyword s_clear_column("CLEAR COLUMN"); ParserKeyword s_modify_column("MODIFY COLUMN"); ParserKeyword s_modify_primary_key("MODIFY PRIMARY KEY"); + ParserKeyword s_modify_order_by("MODIFY ORDER BY"); ParserKeyword s_attach_partition("ATTACH PARTITION"); ParserKeyword s_detach_partition("DETACH PARTITION"); @@ -200,6 +201,21 @@ bool ParserAlterCommand::parseImpl(Pos & pos, ASTPtr & node, Expected & expected command->type = ASTAlterCommand::MODIFY_PRIMARY_KEY; } + else if (s_modify_order_by.ignore(pos, expected)) + { + if (pos->type != TokenType::OpeningRoundBracket) + return false; + ++pos; + + if (!ParserNotEmptyExpressionList(false).parse(pos, command->sorting_key, expected)) + return false; + + if (pos->type != TokenType::ClosingRoundBracket) + return false; + ++pos; + + command->type = ASTAlterCommand::MODIFY_ORDER_BY; + } else if (s_delete_where.ignore(pos, expected)) { if (!parser_exp_elem.parse(pos, command->predicate, expected)) diff --git a/dbms/src/Storages/AlterCommands.cpp b/dbms/src/Storages/AlterCommands.cpp index 9e6d525f685bf071f790631c058141ae6fdc7b42..8f8537968da429d0f7e2e18fca90a069b8e374d2 100644 --- a/dbms/src/Storages/AlterCommands.cpp +++ b/dbms/src/Storages/AlterCommands.cpp @@ -90,6 +90,13 @@ std::optional AlterCommand::parse(const ASTAlterCommand * command_ command.primary_key = command_ast->primary_key; return command; } + else if (command_ast->type == ASTAlterCommand::MODIFY_ORDER_BY) + { + AlterCommand command; + command.type = AlterCommand::MODIFY_ORDER_BY; + command.sorting_key = command_ast->sorting_key; + return command; + } else return {}; } @@ -232,7 +239,7 @@ void AlterCommand::apply(ColumnsDescription & columns_description) const /// both old and new columns have default expression, update it columns_description.defaults[column_name].expression = default_expression; } - else if (type == MODIFY_PRIMARY_KEY) + else if (type == MODIFY_PRIMARY_KEY || type == MODIFY_ORDER_BY) { /// This have no relation to changing the list of columns. /// TODO Check that all columns exist, that only columns with constant defaults are added. diff --git a/dbms/src/Storages/AlterCommands.h b/dbms/src/Storages/AlterCommands.h index 888bd64f03e2a63445c107fad1c0b9542f4e76f4..d6806eb48af96f185d31320ae1542d1943db72e2 100644 --- a/dbms/src/Storages/AlterCommands.h +++ b/dbms/src/Storages/AlterCommands.h @@ -21,6 +21,7 @@ struct AlterCommand DROP_COLUMN, MODIFY_COLUMN, MODIFY_PRIMARY_KEY, + MODIFY_ORDER_BY, }; Type type; @@ -42,6 +43,9 @@ struct AlterCommand /// For MODIFY_PRIMARY_KEY ASTPtr primary_key; + /// For MODIFY_ORDER_BY + ASTPtr sorting_key; + AlterCommand() = default; AlterCommand(const Type type, const String & column_name, const DataTypePtr & data_type, const ColumnDefaultKind default_kind, const ASTPtr & default_expression,