diff --git a/docs/en/sql-reference/statements/alter/column.md b/docs/en/sql-reference/statements/alter/column.md index 95c4cb6898c..2e562e20467 100644 --- a/docs/en/sql-reference/statements/alter/column.md +++ b/docs/en/sql-reference/statements/alter/column.md @@ -10,7 +10,7 @@ A set of queries that allow changing the table structure. Syntax: ``` sql -ALTER TABLE [db].name [ON CLUSTER cluster] ADD|DROP|RENAME|CLEAR|COMMENT|MODIFY|MATERIALIZE COLUMN ... +ALTER TABLE [db].name [ON CLUSTER cluster] ADD|DROP|RENAME|CLEAR|COMMENT|{MODIFY|ALTER}|MATERIALIZE COLUMN ... ``` In the query, specify a list of one or more comma-separated actions. @@ -138,6 +138,7 @@ ALTER TABLE visits COMMENT COLUMN browser 'The table shows the browser used for ``` sql MODIFY COLUMN [IF EXISTS] name [type] [default_expr] [codec] [TTL] [AFTER name_after | FIRST] +ALTER COLUMN [IF EXISTS] name TYPE [type] [default_expr] [codec] [TTL] [AFTER name_after | FIRST] ``` This query changes the `name` column properties: diff --git a/docs/ru/sql-reference/statements/alter/column.md b/docs/ru/sql-reference/statements/alter/column.md index 8378478d801..4de2d067cce 100644 --- a/docs/ru/sql-reference/statements/alter/column.md +++ b/docs/ru/sql-reference/statements/alter/column.md @@ -10,7 +10,7 @@ toc_title: "Манипуляции со столбцами" Синтаксис: ``` sql -ALTER TABLE [db].name [ON CLUSTER cluster] ADD|DROP|RENAME|CLEAR|COMMENT|MODIFY|MATERIALIZE COLUMN ... +ALTER TABLE [db].name [ON CLUSTER cluster] ADD|DROP|RENAME|CLEAR|COMMENT|{MODIFY|ALTER}|MATERIALIZE COLUMN ... ``` В запросе можно указать сразу несколько действий над одной таблицей через запятую. @@ -138,6 +138,7 @@ ALTER TABLE visits COMMENT COLUMN browser 'Столбец показывает, ``` sql MODIFY COLUMN [IF EXISTS] name [type] [default_expr] [codec] [TTL] [AFTER name_after | FIRST] +ALTER COLUMN [IF EXISTS] name TYPE [type] [default_expr] [codec] [TTL] [AFTER name_after | FIRST] ``` Запрос изменяет следующие свойства столбца `name`: diff --git a/src/Parsers/ParserAlterQuery.cpp b/src/Parsers/ParserAlterQuery.cpp index 66645ccaf0e..ce45d40b641 100644 --- a/src/Parsers/ParserAlterQuery.cpp +++ b/src/Parsers/ParserAlterQuery.cpp @@ -26,6 +26,7 @@ bool ParserAlterCommand::parseImpl(Pos & pos, ASTPtr & node, Expected & expected ParserKeyword s_drop_column("DROP COLUMN"); ParserKeyword s_clear_column("CLEAR COLUMN"); ParserKeyword s_modify_column("MODIFY COLUMN"); + ParserKeyword s_alter_column("ALTER COLUMN"); ParserKeyword s_rename_column("RENAME COLUMN"); ParserKeyword s_comment_column("COMMENT COLUMN"); ParserKeyword s_materialize_column("MATERIALIZE COLUMN"); @@ -619,11 +620,14 @@ bool ParserAlterCommand::parseImpl(Pos & pos, ASTPtr & node, Expected & expected return false; } } - else if (s_modify_column.ignore(pos, expected)) + else if (bool is_modify = s_modify_column.ignore(pos, expected); is_modify || s_alter_column.ignore(pos, expected)) { if (s_if_exists.ignore(pos, expected)) command->if_exists = true; + if (!is_modify) + parser_modify_col_decl.enableCheckTypeKeyword(); + if (!parser_modify_col_decl.parse(pos, command->col_decl, expected)) return false; diff --git a/src/Parsers/ParserCreateQuery.h b/src/Parsers/ParserCreateQuery.h index 537eb0f7d74..7b4978d7414 100644 --- a/src/Parsers/ParserCreateQuery.h +++ b/src/Parsers/ParserCreateQuery.h @@ -96,6 +96,8 @@ public: { } + void enableCheckTypeKeyword() { check_type_keyword = true; } + protected: using ASTDeclarePtr = std::shared_ptr; @@ -106,6 +108,8 @@ protected: bool require_type = true; bool allow_null_modifiers = false; bool check_keywords_after_name = false; + /// just for ALTER TABLE ALTER COLUMN use + bool check_type_keyword = false; }; using ParserColumnDeclaration = IParserColumnDeclaration; @@ -125,6 +129,7 @@ bool IParserColumnDeclaration::parseImpl(Pos & pos, ASTPtr & node, E ParserKeyword s_codec{"CODEC"}; ParserKeyword s_ttl{"TTL"}; ParserKeyword s_remove{"REMOVE"}; + ParserKeyword s_type{"TYPE"}; ParserTernaryOperatorExpression expr_parser; ParserStringLiteral string_literal_parser; ParserCodec codec_parser; @@ -171,6 +176,8 @@ bool IParserColumnDeclaration::parseImpl(Pos & pos, ASTPtr & node, E || (!s_comment.checkWithoutMoving(pos, expected) && !s_codec.checkWithoutMoving(pos, expected)))) { + if (check_type_keyword && !s_type.ignore(pos, expected)) + return false; if (!type_parser.parse(pos, type, expected)) return false; } diff --git a/tests/queries/0_stateless/02126_alter_table_alter_column.reference b/tests/queries/0_stateless/02126_alter_table_alter_column.reference new file mode 100644 index 00000000000..6d1fffb6a80 --- /dev/null +++ b/tests/queries/0_stateless/02126_alter_table_alter_column.reference @@ -0,0 +1,3 @@ +CREATE TABLE default.alter_column_02126\n(\n `a` Int32,\n `x` Int32,\n `y` Int32\n)\nENGINE = MergeTree\nORDER BY a\nSETTINGS index_granularity = 8192 +CREATE TABLE default.alter_column_02126\n(\n `a` Int32,\n `x` Float32,\n `y` Int32\n)\nENGINE = MergeTree\nORDER BY a\nSETTINGS index_granularity = 8192 +CREATE TABLE default.alter_column_02126\n(\n `a` Int32,\n `x` Float64,\n `y` Float32\n)\nENGINE = MergeTree\nORDER BY a\nSETTINGS index_granularity = 8192 diff --git a/tests/queries/0_stateless/02126_alter_table_alter_column.sql b/tests/queries/0_stateless/02126_alter_table_alter_column.sql new file mode 100644 index 00000000000..149c7fa6852 --- /dev/null +++ b/tests/queries/0_stateless/02126_alter_table_alter_column.sql @@ -0,0 +1,9 @@ +DROP TABLE IF EXISTS alter_column_02126; +CREATE TABLE alter_column_02126 (a Int, x Int, y Int) ENGINE = MergeTree ORDER BY a; +SHOW CREATE TABLE alter_column_02126; +ALTER TABLE alter_column_02126 ALTER COLUMN x TYPE Float32; +SHOW CREATE TABLE alter_column_02126; +ALTER TABLE alter_column_02126 ALTER COLUMN x TYPE Float64, MODIFY COLUMN y Float32; +SHOW CREATE TABLE alter_column_02126; +ALTER TABLE alter_column_02126 MODIFY COLUMN y TYPE Float32; -- { clientError 62 } +ALTER TABLE alter_column_02126 ALTER COLUMN y Float32; -- { clientError 62 }