From cffd7b205c8330f205a1232215624b9d8d45fb2d Mon Sep 17 00:00:00 2001 From: robot-clickhouse Date: Wed, 7 Feb 2024 15:06:50 +0000 Subject: [PATCH] =?UTF-8?q?Backport=20#59445=20to=2024.1:=20Fix=20`ASTAlte?= =?UTF-8?q?rCommand::formatImpl`=20in=20case=20of=20column=20specific=20se?= =?UTF-8?q?ttings=E2=80=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sql-reference/statements/alter/column.md | 22 +++++++++++-------- src/Parsers/ASTAlterQuery.cpp | 10 +++++++++ .../02870_per_column_settings.reference | 8 +++++-- .../0_stateless/02870_per_column_settings.sql | 8 +++++-- 4 files changed, 35 insertions(+), 13 deletions(-) diff --git a/docs/en/sql-reference/statements/alter/column.md b/docs/en/sql-reference/statements/alter/column.md index 676d30f5e447..f6d9668e628e 100644 --- a/docs/en/sql-reference/statements/alter/column.md +++ b/docs/en/sql-reference/statements/alter/column.md @@ -139,8 +139,8 @@ ALTER TABLE visits COMMENT COLUMN browser 'This column shows the browser used fo ## MODIFY COLUMN ``` 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] +MODIFY COLUMN [IF EXISTS] name [type] [default_expr] [codec] [TTL] [settings] [AFTER name_after | FIRST] +ALTER COLUMN [IF EXISTS] name TYPE [type] [default_expr] [codec] [TTL] [settings] [AFTER name_after | FIRST] ``` This query changes the `name` column properties: @@ -153,10 +153,14 @@ This query changes the `name` column properties: - TTL +- Column-level Settings + For examples of columns compression CODECS modifying, see [Column Compression Codecs](../create/table.md/#codecs). For examples of columns TTL modifying, see [Column TTL](/docs/en/engines/table-engines/mergetree-family/mergetree.md/#mergetree-column-ttl). +For examples of column-level settings modifying, see [Column-level Settings](/docs/en/engines/table-engines/mergetree-family/mergetree.md/#column-level-settings). + If the `IF EXISTS` clause is specified, the query won’t return an error if the column does not exist. When changing the type, values are converted as if the [toType](/docs/en/sql-reference/functions/type-conversion-functions.md) functions were applied to them. If only the default expression is changed, the query does not do anything complex, and is completed almost instantly. @@ -209,7 +213,7 @@ The `ALTER` query for changing columns is replicated. The instructions are saved ## MODIFY COLUMN REMOVE -Removes one of the column properties: `DEFAULT`, `ALIAS`, `MATERIALIZED`, `CODEC`, `COMMENT`, `TTL`, `SETTING`. +Removes one of the column properties: `DEFAULT`, `ALIAS`, `MATERIALIZED`, `CODEC`, `COMMENT`, `TTL`, `SETTINGS`. Syntax: @@ -237,7 +241,7 @@ Modify a column setting. Syntax: ```sql -ALTER TABLE table_name MODIFY COLUMN MODIFY SETTING name=value,...; +ALTER TABLE table_name MODIFY COLUMN column_name MODIFY SETTING name=value,...; ``` **Example** @@ -245,7 +249,7 @@ ALTER TABLE table_name MODIFY COLUMN MODIFY SETTING name=value,...; Modify column's `max_compress_block_size` to `1MB`: ```sql -ALTER TABLE table_name MODIFY COLUMN MODIFY SETTING max_compress_block_size = 1048576; +ALTER TABLE table_name MODIFY COLUMN column_name MODIFY SETTING max_compress_block_size = 1048576; ``` ## MODIFY COLUMN RESET SETTING @@ -255,21 +259,21 @@ Reset a column setting, also removes the setting declaration in the column expre Syntax: ```sql -ALTER TABLE table_name MODIFY COLUMN RESET SETTING name,...; +ALTER TABLE table_name MODIFY COLUMN column_name RESET SETTING name,...; ``` **Example** -Remove column setting `max_compress_block_size` to `1MB`: +Reset column setting `max_compress_block_size` to it's default value: ```sql -ALTER TABLE table_name MODIFY COLUMN REMOVE SETTING max_compress_block_size; +ALTER TABLE table_name MODIFY COLUMN column_name RESET SETTING max_compress_block_size; ``` ## MATERIALIZE COLUMN Materializes or updates a column with an expression for a default value (`DEFAULT` or `MATERIALIZED`). -It is used if it is necessary to add or update a column with a complicated expression, because evaluating such an expression directly on `SELECT` executing turns out to be expensive. +It is used if it is necessary to add or update a column with a complicated expression, because evaluating such an expression directly on `SELECT` executing turns out to be expensive. Implemented as a [mutation](/docs/en/sql-reference/statements/alter/index.md#mutations). Syntax: diff --git a/src/Parsers/ASTAlterQuery.cpp b/src/Parsers/ASTAlterQuery.cpp index e229095df1b7..a65431909043 100644 --- a/src/Parsers/ASTAlterQuery.cpp +++ b/src/Parsers/ASTAlterQuery.cpp @@ -104,6 +104,16 @@ void ASTAlterCommand::formatImpl(const FormatSettings & settings, FormatState & { settings.ostr << (settings.hilite ? hilite_keyword : "") << " REMOVE " << remove_property; } + else if (settings_changes) + { + settings.ostr << (settings.hilite ? hilite_keyword : "") << " MODIFY SETTING " << (settings.hilite ? hilite_none : ""); + settings_changes->formatImpl(settings, state, frame); + } + else if (settings_resets) + { + settings.ostr << (settings.hilite ? hilite_keyword : "") << " RESET SETTING " << (settings.hilite ? hilite_none : ""); + settings_resets->formatImpl(settings, state, frame); + } else { if (first) diff --git a/tests/queries/0_stateless/02870_per_column_settings.reference b/tests/queries/0_stateless/02870_per_column_settings.reference index 144c8c5ee2eb..c2ae34928bd4 100644 --- a/tests/queries/0_stateless/02870_per_column_settings.reference +++ b/tests/queries/0_stateless/02870_per_column_settings.reference @@ -1,10 +1,14 @@ CREATE TABLE default.tab\n(\n `id` UInt64,\n `long_string` String SETTINGS (min_compress_block_size = 163840, max_compress_block_size = 163840),\n `v1` String,\n `v2` UInt64,\n `v3` Float32,\n `v4` Float64\n)\nENGINE = ReplicatedMergeTree(\'/clickhouse/tables/default/tab/2870\', \'r1\')\nORDER BY id\nSETTINGS min_bytes_for_wide_part = 1, index_granularity = 8192 1000 +ALTER TABLE tab\n MODIFY COLUMN `long_string` MODIFY SETTING min_compress_block_size = 8192 CREATE TABLE default.tab\n(\n `id` UInt64,\n `long_string` String SETTINGS (min_compress_block_size = 8192, max_compress_block_size = 163840),\n `v1` String,\n `v2` UInt64,\n `v3` Float32,\n `v4` Float64\n)\nENGINE = ReplicatedMergeTree(\'/clickhouse/tables/default/tab/2870\', \'r1\')\nORDER BY id\nSETTINGS min_bytes_for_wide_part = 1, index_granularity = 8192 +ALTER TABLE tab\n MODIFY COLUMN `long_string` RESET SETTING min_compress_block_size CREATE TABLE default.tab\n(\n `id` UInt64,\n `long_string` String SETTINGS (max_compress_block_size = 163840),\n `v1` String,\n `v2` UInt64,\n `v3` Float32,\n `v4` Float64\n)\nENGINE = ReplicatedMergeTree(\'/clickhouse/tables/default/tab/2870\', \'r1\')\nORDER BY id\nSETTINGS min_bytes_for_wide_part = 1, index_granularity = 8192 +ALTER TABLE tab\n MODIFY COLUMN `long_string` REMOVE SETTINGS CREATE TABLE default.tab\n(\n `id` UInt64,\n `long_string` String,\n `v1` String,\n `v2` UInt64,\n `v3` Float32,\n `v4` Float64\n)\nENGINE = ReplicatedMergeTree(\'/clickhouse/tables/default/tab/2870\', \'r1\')\nORDER BY id\nSETTINGS min_bytes_for_wide_part = 1, index_granularity = 8192 +ALTER TABLE tab\n MODIFY COLUMN `long_string` String SETTINGS (min_compress_block_size = 163840, max_compress_block_size = 163840) CREATE TABLE default.tab\n(\n `id` UInt64,\n `long_string` String SETTINGS (min_compress_block_size = 163840, max_compress_block_size = 163840),\n `v1` String,\n `v2` UInt64,\n `v3` Float32,\n `v4` Float64\n)\nENGINE = ReplicatedMergeTree(\'/clickhouse/tables/default/tab/2870\', \'r1\')\nORDER BY id\nSETTINGS min_bytes_for_wide_part = 1, index_granularity = 8192 ---- +--- (0,0) 0 (1,1) 1 (2,2) 2 @@ -15,4 +19,4 @@ CREATE TABLE default.tab\n(\n `id` UInt64,\n `long_string` String SETTINGS (7,7) 7 (8,8) 8 (9,9) 9 ---- +--- diff --git a/tests/queries/0_stateless/02870_per_column_settings.sql b/tests/queries/0_stateless/02870_per_column_settings.sql index 345cf5cc7449..d242ebe6c61a 100644 --- a/tests/queries/0_stateless/02870_per_column_settings.sql +++ b/tests/queries/0_stateless/02870_per_column_settings.sql @@ -23,21 +23,25 @@ SHOW CREATE tab; INSERT INTO TABLE tab SELECT number, randomPrintableASCII(1000), randomPrintableASCII(10), rand(number), rand(number+1), rand(number+2) FROM numbers(1000); SELECT count() FROM tab; +SELECT formatQuery('ALTER TABLE tab MODIFY COLUMN long_string MODIFY SETTING min_compress_block_size = 8192;'); ALTER TABLE tab MODIFY COLUMN long_string MODIFY SETTING min_compress_block_size = 8192; SHOW CREATE tab; +SELECT formatQuery('ALTER TABLE tab MODIFY COLUMN long_string RESET SETTING min_compress_block_size;'); ALTER TABLE tab MODIFY COLUMN long_string RESET SETTING min_compress_block_size; SHOW CREATE tab; +SELECT formatQuery('ALTER TABLE tab MODIFY COLUMN long_string REMOVE SETTINGS;'); ALTER TABLE tab MODIFY COLUMN long_string REMOVE SETTINGS; SHOW CREATE tab; +SELECT formatQuery('ALTER TABLE tab MODIFY COLUMN long_string String SETTINGS (min_compress_block_size = 163840, max_compress_block_size = 163840);'); ALTER TABLE tab MODIFY COLUMN long_string String SETTINGS (min_compress_block_size = 163840, max_compress_block_size = 163840); SHOW CREATE tab; DROP TABLE tab; -SELECT '--- '; +SELECT '---'; SET allow_experimental_object_type = 1; @@ -56,7 +60,7 @@ SELECT tup, json.key AS key FROM tab ORDER BY key LIMIT 10; DROP TABLE tab; -SELECT '--- '; +SELECT '---'; -- Unsupported column-level settings are rejected CREATE TABLE tab