implement nested renames

This commit is contained in:
Aleksei Lebedev 2024-08-28 09:16:58 +02:00
parent e7054029c4
commit 25db7623fb
6 changed files with 45 additions and 21 deletions

View File

@ -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

View File

@ -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,17 +1567,11 @@ 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");
}
}
else if (command.type == AlterCommand::REMOVE_TTL && !metadata.hasAnyTableTTL())
{
throw Exception(ErrorCodes::BAD_ARGUMENTS, "Table doesn't have any table TTL expression, cannot remove");

View File

@ -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']]

View File

@ -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}

View File

@ -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

View File

@ -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;