diff --git a/docs/en/sql-reference/data-types/nested-data-structures/index.md b/docs/en/sql-reference/data-types/nested-data-structures/index.md index 579ee9bfa8b..952ccd2f449 100644 --- a/docs/en/sql-reference/data-types/nested-data-structures/index.md +++ b/docs/en/sql-reference/data-types/nested-data-structures/index.md @@ -102,4 +102,19 @@ For an INSERT query, you should pass all the component column arrays of a nested For a DESCRIBE query, the columns in a nested data structure are listed separately in the same way. -The ALTER query for elements in a nested data structure has limitations. +The ALTER query for elements in a nested data structure has limitations: + + - Rename for the whole nested structure is not supported, example: + ``` sql + + ALTER TABLE test.visits RENAME COLUMN Goals to GoalsRenamed; + + ``` + - Rename one nested field to another nested field are only supported if they have the same prefix before the first dot (`.`): + ``` sql + ALTER TABLE nested_table RENAME COLUMN type1.x to type1.x_renamed; # supported + ALTER TABLE nested_table RENAME COLUMN type1.x to type1_renamed.x; # not supported + ALTER TABLE nested_table RENAME COLUMN type1.x.y to type1.y.x; # supported + ``` + + - Rename nested columns to not nested and vice versa is supported diff --git a/src/Storages/AlterCommands.cpp b/src/Storages/AlterCommands.cpp index d92d8b59f6e..af25ae5ba7e 100644 --- a/src/Storages/AlterCommands.cpp +++ b/src/Storages/AlterCommands.cpp @@ -1519,7 +1519,7 @@ void AlterCommands::validate(const StoragePtr & table, ContextPtr context) const if (next_command.type == AlterCommand::RENAME_COLUMN) { if (next_command.column_name == command.rename_to) - throw Exception(ErrorCodes::NOT_IMPLEMENTED, "Transitive renames in a single ALTER query are not allowed (don't make sense)"); + throw Exception(ErrorCodes::NOT_IMPLEMENTED, "Transitive renames in a single ALTER query are not allowed (doesn't make sense)"); else if (next_command.column_name == command.column_name) throw Exception(ErrorCodes::BAD_ARGUMENTS, "Cannot rename column '{}' to two different names in a single ALTER query", backQuote(command.column_name)); @@ -1567,16 +1567,10 @@ void AlterCommands::validate(const StoragePtr & table, ContextPtr context) const if (from_nested_table_name != to_nested_table_name) throw Exception(ErrorCodes::BAD_ARGUMENTS, "Cannot rename column from one nested name to another"); } - else if (!from_nested && !to_nested) - { - all_columns.rename(command.column_name, command.rename_to); - renamed_columns.emplace(command.column_name); - renamed_columns.emplace(command.rename_to); - } - else - { - throw Exception(ErrorCodes::BAD_ARGUMENTS, "Cannot rename column from nested struct to normal column and vice versa"); - } + + all_columns.rename(command.column_name, command.rename_to); + renamed_columns.emplace(command.column_name); + renamed_columns.emplace(command.rename_to); } else if (command.type == AlterCommand::REMOVE_TTL && !metadata.hasAnyTableTTL()) { diff --git a/tests/queries/0_stateless/01213_alter_rename_nested.reference b/tests/queries/0_stateless/01213_alter_rename_nested.reference index 8277f00498b..0b112b5ffa6 100644 --- a/tests/queries/0_stateless/01213_alter_rename_nested.reference +++ b/tests/queries/0_stateless/01213_alter_rename_nested.reference @@ -4,7 +4,9 @@ CREATE TABLE default.table_for_rename_nested\n(\n `date` Date,\n `key` UIn CREATE TABLE default.table_for_rename_nested\n(\n `date` Date,\n `key` UInt64,\n `n.renamed_x` Array(UInt32),\n `n.renamed_y` Array(String),\n `value1` Array(Array(LowCardinality(String)))\n)\nENGINE = MergeTree\nPARTITION BY date\nORDER BY key\nSETTINGS index_granularity = 8192 7 [8,9,10] 7 ['a','b','c'] +CREATE TABLE default.table_for_rename_nested\n(\n `date` Date,\n `key` UInt64,\n `not_nested_x` Array(UInt32),\n `n.renamed_y` Array(String),\n `value1` Array(Array(LowCardinality(String)))\n)\nENGINE = MergeTree\nPARTITION BY date\nORDER BY key\nSETTINGS index_granularity = 8192 +7 [8,9,10] [['7']] -CREATE TABLE default.table_for_rename_nested\n(\n `date` Date,\n `key` UInt64,\n `n.renamed_x` Array(UInt32),\n `n.renamed_y` Array(String),\n `renamed_value1` Array(Array(LowCardinality(String)))\n)\nENGINE = MergeTree\nPARTITION BY date\nORDER BY key\nSETTINGS index_granularity = 8192 -date key n.renamed_x n.renamed_y renamed_value1 +CREATE TABLE default.table_for_rename_nested\n(\n `date` Date,\n `key` UInt64,\n `not_nested_x` Array(UInt32),\n `n.renamed_y` Array(String),\n `renamed_value1` Array(Array(LowCardinality(String)))\n)\nENGINE = MergeTree\nPARTITION BY date\nORDER BY key\nSETTINGS index_granularity = 8192 +date key not_nested_x n.renamed_y renamed_value1 2019-10-01 7 [8,9,10] ['a','b','c'] [['7']] diff --git a/tests/queries/0_stateless/01213_alter_rename_nested.sql b/tests/queries/0_stateless/01213_alter_rename_nested.sql index cc607e0b4f3..e17e72fc265 100644 --- a/tests/queries/0_stateless/01213_alter_rename_nested.sql +++ b/tests/queries/0_stateless/01213_alter_rename_nested.sql @@ -25,7 +25,10 @@ SHOW CREATE TABLE table_for_rename_nested; SELECT key, n.renamed_x FROM table_for_rename_nested WHERE key = 7; SELECT key, n.renamed_y FROM table_for_rename_nested WHERE key = 7; -ALTER TABLE table_for_rename_nested RENAME COLUMN n.renamed_x TO not_nested_x; --{serverError BAD_ARGUMENTS} +ALTER TABLE table_for_rename_nested RENAME COLUMN n.renamed_x TO not_nested_x; + +SHOW CREATE TABLE table_for_rename_nested; +SELECT key, not_nested_x FROM table_for_rename_nested WHERE key = 7; -- Currently not implemented ALTER TABLE table_for_rename_nested RENAME COLUMN n TO renamed_n; --{serverError NOT_IMPLEMENTED} diff --git a/tests/queries/0_stateless/01213_alter_table_rename_nested.reference b/tests/queries/0_stateless/01213_alter_table_rename_nested.reference index d06fb9dc00f..b587acdcecb 100644 --- a/tests/queries/0_stateless/01213_alter_table_rename_nested.reference +++ b/tests/queries/0_stateless/01213_alter_table_rename_nested.reference @@ -4,3 +4,7 @@ CREATE TABLE default.table_for_rename_nested\n(\n `date` Date,\n `key` UIn CREATE TABLE default.table_for_rename_nested\n(\n `date` Date,\n `key` UInt64,\n `n.renamed_x` Array(UInt32),\n `n.renamed_y` Array(String),\n `value1` String\n)\nENGINE = MergeTree\nPARTITION BY date\nORDER BY key\nSETTINGS index_granularity = 8192 7 [8,9,10] 7 ['a','b','c'] +CREATE TABLE default.table_for_rename_nested\n(\n `date` Date,\n `key` UInt64,\n `not_nested_x` Array(UInt32),\n `n.renamed_y` Array(String),\n `value1` String\n)\nENGINE = MergeTree\nPARTITION BY date\nORDER BY key\nSETTINGS index_granularity = 8192 +CREATE TABLE default.table_for_rename_nested\n(\n `date` Date,\n `key` UInt64,\n `not_nested_x` Array(UInt32),\n `n.renamed_y` Array(String),\n `value.one` String\n)\nENGINE = MergeTree\nPARTITION BY date\nORDER BY key\nSETTINGS index_granularity = 8192 +date key not_nested_x n.renamed_y value.one +2019-10-01 7 [8,9,10] ['a','b','c'] 7 diff --git a/tests/queries/0_stateless/01213_alter_table_rename_nested.sql b/tests/queries/0_stateless/01213_alter_table_rename_nested.sql index 5efc065819b..2263834d533 100644 --- a/tests/queries/0_stateless/01213_alter_table_rename_nested.sql +++ b/tests/queries/0_stateless/01213_alter_table_rename_nested.sql @@ -25,14 +25,20 @@ SHOW CREATE TABLE table_for_rename_nested; SELECT key, n.renamed_x FROM table_for_rename_nested WHERE key = 7; SELECT key, n.renamed_y FROM table_for_rename_nested WHERE key = 7; -ALTER TABLE table_for_rename_nested RENAME COLUMN n.renamed_x TO not_nested_x; --{serverError BAD_ARGUMENTS} - -ALTER TABLE table_for_rename_nested RENAME COLUMN n.renamed_x TO q.renamed_x; --{serverError BAD_ARGUMENTS} - -ALTER TABLE table_for_rename_nested RENAME COLUMN value1 TO q.renamed_x; --{serverError BAD_ARGUMENTS} - -- Currently not implemented ALTER TABLE table_for_rename_nested RENAME COLUMN n TO renamed_n; --{serverError NOT_IMPLEMENTED} +ALTER TABLE table_for_rename_nested RENAME COLUMN n.renamed_x TO not_nested_x; +SHOW CREATE TABLE table_for_rename_nested; + +ALTER TABLE table_for_rename_nested RENAME COLUMN n.renamed_y TO q.renamed_y; --{serverError BAD_ARGUMENTS} +ALTER TABLE table_for_rename_nested RENAME COLUMN value1 TO n.renamed_y; --{serverError DUPLICATE_COLUMN} + +ALTER TABLE table_for_rename_nested RENAME COLUMN value1 TO value.one; +SHOW CREATE TABLE table_for_rename_nested; + + +SELECT * FROM table_for_rename_nested WHERE key = 7 FORMAT TSVWithNames; + DROP TABLE IF EXISTS table_for_rename_nested;