Skip to content

Commit 391d700

Browse files
Backport #92419 to 25.10: Inherit source part serialization info settings during mutation in MergeTree
1 parent e816985 commit 391d700

3 files changed

Lines changed: 30 additions & 6 deletions

File tree

src/Storages/MergeTree/MutateTask.cpp

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -521,13 +521,25 @@ getColumnsForNewDataPart(
521521
}
522522
}
523523

524-
SerializationInfo::Settings settings
524+
SerializationInfo::Settings settings;
525+
/// If mutations doesn't affect all columns we must use serialization info settings from source part,
526+
/// because data files of some columns might be copied without actual serialization, so changes in serialization
527+
/// settings will not be applied for them (for example, new serialization versions for data types).
528+
if (!affects_all_columns)
525529
{
526-
(*source_part->storage.getSettings())[MergeTreeSetting::ratio_of_defaults_for_sparse_serialization],
527-
false,
528-
(*source_part->storage.getSettings())[MergeTreeSetting::serialization_info_version],
529-
(*source_part->storage.getSettings())[MergeTreeSetting::string_serialization_version],
530-
};
530+
settings = serialization_infos.getSettings();
531+
}
532+
/// Otherwise use fresh settings from storage.
533+
else
534+
{
535+
settings = SerializationInfo::Settings
536+
{
537+
(*source_part->storage.getSettings())[MergeTreeSetting::ratio_of_defaults_for_sparse_serialization],
538+
false,
539+
(*source_part->storage.getSettings())[MergeTreeSetting::serialization_info_version],
540+
(*source_part->storage.getSettings())[MergeTreeSetting::string_serialization_version],
541+
};
542+
}
531543

532544
SerializationInfoByName new_serialization_infos(settings);
533545
for (const auto & [name, old_info] : serialization_infos)
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
abc99 def
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
drop table if exists test;
2+
create table test (s String) engine=MergeTree order by tuple() settings min_bytes_for_wide_part=1, string_serialization_version='single_stream';
3+
insert into test select 'abc' || toString(number) from numbers(100);
4+
alter table test modify setting string_serialization_version='with_size_stream';
5+
alter table test add column s1 String default 'def' settings alter_sync=2;
6+
alter table test materialize column s1 settings mutations_sync=1;
7+
detach table test;
8+
attach table test;
9+
select max(s), max(s1) from test;
10+
drop table test;
11+

0 commit comments

Comments
 (0)