Skip to content

Commit 32c9e33

Browse files
authored
Merge pull request #1821 from Altinity/backports/25.8.16/102689_2
Backport of ClickHouse#102689 to 25.8.16: Fix columns_substreams.txt corruption during column rename in some cases
2 parents 34590f8 + b1f395a commit 32c9e33

3 files changed

Lines changed: 112 additions & 2 deletions

File tree

src/DataTypes/Serializations/ISerialization.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -301,11 +301,11 @@ String ISerialization::getFileNameForRenamedColumnStream(const String & name_fro
301301
{
302302
auto name_from_escaped = escapeForFileName(name_from);
303303
if (file_name.starts_with(name_from_escaped))
304-
return escapeForFileName(name_to) + file_name.substr(0, name_from_escaped.size());
304+
return escapeForFileName(name_to) + file_name.substr(name_from_escaped.size());
305305

306306
auto nested_storage_name_escaped = escapeForFileName(Nested::extractTableName(name_from));
307307
if (file_name.starts_with(nested_storage_name_escaped))
308-
return escapeForFileName(Nested::extractTableName(name_to)) + file_name.substr(0, nested_storage_name_escaped.size());
308+
return escapeForFileName(Nested::extractTableName(name_to)) + file_name.substr(nested_storage_name_escaped.size());
309309

310310
throw Exception(ErrorCodes::LOGICAL_ERROR, "File name {} doesn't correspond to column {}", file_name, name_from);
311311
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
Before rename:
2+
columns substreams version: 1
3+
2 columns:
4+
1 substreams for column `id`:
5+
id
6+
2 substreams for column `arr`:
7+
arr.size0
8+
arr
9+
After rename arr -> brr:
10+
columns substreams version: 1
11+
2 columns:
12+
1 substreams for column `id`:
13+
id
14+
2 substreams for column `brr`:
15+
brr.size0
16+
brr
17+
Nested before rename:
18+
columns substreams version: 1
19+
3 columns:
20+
1 substreams for column `id`:
21+
id
22+
2 substreams for column `nested.a`:
23+
nested.size0
24+
nested%2Ea
25+
2 substreams for column `nested.b`:
26+
nested.size0
27+
nested%2Eb
28+
Nested after rename nested.a -> nested.aa:
29+
columns substreams version: 1
30+
3 columns:
31+
1 substreams for column `id`:
32+
id
33+
2 substreams for column `nested.aa`:
34+
nested.size0
35+
nested%2Eaa
36+
2 substreams for column `nested.b`:
37+
nested.size0
38+
nested%2Eb
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
#!/usr/bin/env bash
2+
# Tags: no-shared-merge-tree, no-object-storage
3+
4+
CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
5+
# shellcheck source=../shell_config.sh
6+
. "$CURDIR"/../shell_config.sh
7+
8+
${CLICKHOUSE_CLIENT} --query "DROP TABLE IF EXISTS test_rename_substreams"
9+
10+
${CLICKHOUSE_CLIENT} --query "
11+
CREATE TABLE test_rename_substreams
12+
(
13+
id UInt32,
14+
arr Array(UInt32)
15+
)
16+
ENGINE = MergeTree
17+
ORDER BY id
18+
SETTINGS min_rows_for_wide_part = 1, min_bytes_for_wide_part = 1,
19+
enable_block_number_column = 0, enable_block_offset_column = 0,
20+
replace_long_file_name_to_hash = 0, ratio_of_defaults_for_sparse_serialization = 1;
21+
"
22+
23+
${CLICKHOUSE_CLIENT} --query "INSERT INTO test_rename_substreams SELECT number, [number, number + 1] FROM numbers(10)"
24+
25+
# Get data path before rename to verify initial state
26+
DATA_PATH=$(${CLICKHOUSE_CLIENT} --query "SELECT path FROM system.parts WHERE database = currentDatabase() AND table = 'test_rename_substreams' AND active")
27+
28+
echo "Before rename:"
29+
cat "${DATA_PATH}columns_substreams.txt"
30+
31+
# Rename arr -> brr
32+
${CLICKHOUSE_CLIENT} --query "ALTER TABLE test_rename_substreams RENAME COLUMN arr TO brr"
33+
34+
# Get the new part path (mutation creates a new part)
35+
DATA_PATH_NEW=$(${CLICKHOUSE_CLIENT} --query "SELECT path FROM system.parts WHERE database = currentDatabase() AND table = 'test_rename_substreams' AND active")
36+
37+
echo "After rename arr -> brr:"
38+
cat "${DATA_PATH_NEW}columns_substreams.txt"
39+
40+
# Also rename a Nested column to test the second code path (line 450)
41+
${CLICKHOUSE_CLIENT} --query "DROP TABLE IF EXISTS test_rename_nested_substreams"
42+
43+
${CLICKHOUSE_CLIENT} --query "
44+
CREATE TABLE test_rename_nested_substreams
45+
(
46+
id UInt32,
47+
nested Nested(a UInt32, b UInt32)
48+
)
49+
ENGINE = MergeTree
50+
ORDER BY id
51+
SETTINGS min_rows_for_wide_part = 1, min_bytes_for_wide_part = 1,
52+
enable_block_number_column = 0, enable_block_offset_column = 0,
53+
replace_long_file_name_to_hash = 0, ratio_of_defaults_for_sparse_serialization = 1;
54+
"
55+
56+
${CLICKHOUSE_CLIENT} --query "INSERT INTO test_rename_nested_substreams SELECT number, [number], [number + 1] FROM numbers(10)"
57+
58+
DATA_PATH_NESTED=$(${CLICKHOUSE_CLIENT} --query "SELECT path FROM system.parts WHERE database = currentDatabase() AND table = 'test_rename_nested_substreams' AND active")
59+
60+
echo "Nested before rename:"
61+
cat "${DATA_PATH_NESTED}columns_substreams.txt"
62+
63+
# Rename nested.a -> nested.aa
64+
${CLICKHOUSE_CLIENT} --query "ALTER TABLE test_rename_nested_substreams RENAME COLUMN nested.a TO nested.aa"
65+
66+
DATA_PATH_NESTED_NEW=$(${CLICKHOUSE_CLIENT} --query "SELECT path FROM system.parts WHERE database = currentDatabase() AND table = 'test_rename_nested_substreams' AND active")
67+
68+
echo "Nested after rename nested.a -> nested.aa:"
69+
cat "${DATA_PATH_NESTED_NEW}columns_substreams.txt"
70+
71+
${CLICKHOUSE_CLIENT} --query "DROP TABLE test_rename_substreams"
72+
${CLICKHOUSE_CLIENT} --query "DROP TABLE test_rename_nested_substreams"

0 commit comments

Comments
 (0)