Skip to content

Commit e9c8a02

Browse files
authored
Merge pull request #1911 from Altinity/fix/antalya-26.5/fix-settingschangeshistory
[Before forward-ports] Antalya 26.5: patch for `SettingsChangesHistory`
2 parents e53fed7 + e41c6e4 commit e9c8a02

6 files changed

Lines changed: 1727 additions & 9 deletions

File tree

src/Common/ClickHouseVersion.cpp

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,19 +23,37 @@ ClickHouseVersion::ClickHouseVersion(std::string_view version)
2323
if (split.empty())
2424
throw Exception{ErrorCodes::BAD_ARGUMENTS, "Cannot parse ClickHouse version here: {}", version};
2525

26-
for (const auto & split_element : split)
26+
for (size_t i = 0; i < split.size(); ++i)
2727
{
2828
size_t component;
29-
ReadBufferFromString buf(split_element);
29+
ReadBufferFromString buf(split[i]);
3030
if (!tryReadIntText(component, buf) || !buf.eof())
31-
throw Exception{ErrorCodes::BAD_ARGUMENTS, "Cannot parse ClickHouse version here: {}", version};
31+
{
32+
/// A non-numeric part is only allowed as a non-empty terminal suffix after at least
33+
/// one numeric component (e.g. "altinityantalya" in "26.1.3.20001.altinityantalya").
34+
const bool is_terminal = (i + 1 == split.size());
35+
if (components.empty() || !is_terminal || split[i].empty())
36+
throw Exception{ErrorCodes::BAD_ARGUMENTS, "Cannot parse ClickHouse version here: {}", version};
37+
suffix = split[i];
38+
break;
39+
}
3240
components.push_back(component);
3341
}
3442
}
3543

3644
String ClickHouseVersion::toString() const
3745
{
38-
return fmt::format("{}", fmt::join(components, "."));
46+
String result = fmt::format("{}", fmt::join(components, "."));
47+
if (!suffix.empty())
48+
result += "." + suffix;
49+
return result;
50+
}
51+
52+
std::strong_ordering ClickHouseVersion::operator<=>(const ClickHouseVersion & other) const
53+
{
54+
if (auto cmp = components <=> other.components; cmp != 0)
55+
return cmp;
56+
return suffix <=> other.suffix;
3957
}
4058

4159
}

src/Common/ClickHouseVersion.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#pragma once
22

33
#include <compare>
4+
#include <string>
45
#include <vector>
56
#include <string_view>
67

@@ -14,10 +15,12 @@ class ClickHouseVersion
1415

1516
std::string toString() const;
1617

17-
std::strong_ordering operator<=>(const ClickHouseVersion & other) const = default;
18+
std::strong_ordering operator<=>(const ClickHouseVersion & other) const;
1819

1920
private:
2021
std::vector<size_t> components;
22+
/// Non-numeric suffix (e.g. "altinityantalya" for "26.1.3.20001.altinityantalya"); empty for standard versions
23+
std::string suffix;
2124
};
2225

2326
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
#include <Common/ClickHouseVersion.h>
2+
#include <Common/Exception.h>
3+
4+
#include <gtest/gtest.h>
5+
6+
using namespace DB;
7+
8+
TEST(ClickHouseVersion, ParseNumeric)
9+
{
10+
EXPECT_EQ(ClickHouseVersion("26.4").toString(), "26.4");
11+
EXPECT_EQ(ClickHouseVersion("18.12.17").toString(), "18.12.17");
12+
EXPECT_EQ(ClickHouseVersion("26").toString(), "26");
13+
EXPECT_EQ(ClickHouseVersion("26.1.3.20001").toString(), "26.1.3.20001");
14+
}
15+
16+
TEST(ClickHouseVersion, ParseSuffixed)
17+
{
18+
/// A single terminal non-numeric suffix is allowed after numeric components.
19+
EXPECT_EQ(ClickHouseVersion("26.1.3.20001.altinityantalya").toString(), "26.1.3.20001.altinityantalya");
20+
EXPECT_EQ(ClickHouseVersion("25.8.16.20001.altinityantalya").toString(), "25.8.16.20001.altinityantalya");
21+
}
22+
23+
TEST(ClickHouseVersion, RejectMalformed)
24+
{
25+
/// Empty component in the middle.
26+
EXPECT_THROW(ClickHouseVersion("26..1"), Exception);
27+
/// Trailing dot (empty terminal component).
28+
EXPECT_THROW(ClickHouseVersion("26.1."), Exception);
29+
/// Non-numeric component that is not the terminal one.
30+
EXPECT_THROW(ClickHouseVersion("26.x.1"), Exception);
31+
/// A suffix split by a dot is two non-numeric tokens, so the first is intermediate.
32+
EXPECT_THROW(ClickHouseVersion("26.1.altinity.antalya"), Exception);
33+
/// Leading dot (no numeric component before the suffix).
34+
EXPECT_THROW(ClickHouseVersion(".1"), Exception);
35+
/// No numeric component at all.
36+
EXPECT_THROW(ClickHouseVersion("altinityantalya"), Exception);
37+
EXPECT_THROW(ClickHouseVersion(""), Exception);
38+
}
39+
40+
TEST(ClickHouseVersion, Ordering)
41+
{
42+
EXPECT_LT(ClickHouseVersion("26.3"), ClickHouseVersion("26.4"));
43+
EXPECT_GT(ClickHouseVersion("26.4"), ClickHouseVersion("26.3"));
44+
EXPECT_TRUE((ClickHouseVersion("26.4") <=> ClickHouseVersion("26.4")) == std::strong_ordering::equal);
45+
/// A pure numeric version sorts before its suffixed sibling (empty suffix < non-empty suffix).
46+
EXPECT_LT(ClickHouseVersion("26.1.3.20001"), ClickHouseVersion("26.1.3.20001.altinityantalya"));
47+
}

src/Core/SettingsChangesHistory.cpp

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,10 @@ const VersionToSettingsChangesMap & getSettingsChangesHistory()
151151
{"variant_throw_on_type_mismatch", true, true, "New setting to control type mismatch behavior in default Variant implementation"},
152152
{"dynamic_throw_on_type_mismatch", true, true, "New setting to control type mismatch behavior in default Dynamic implementation"},
153153
});
154+
addSettingsChanges(settings_changes_history, "26.3.10.20001.altinityantalya",
155+
{
156+
// {"export_merge_tree_partition_task_timeout_seconds", "3600", "86400", "Increase default value to make it more realistic"},
157+
});
154158
addSettingsChanges(settings_changes_history, "26.3",
155159
{
156160
{"defer_partition_pruning_after_final", false, true, "Gates the FINAL planner's unconditional skipping of partition pruning when the partition-key column is not in the sorting key. The behavior change itself shipped silently in 26.3 via https://github.com/ClickHouse/ClickHouse/pull/98242; this entry retroactively documents it so `compatibility = '26.2'` restores the pre-regression behavior (0 = prune before FINAL, fast; 1 = defer pruning, correctness-safe)."},
@@ -218,6 +222,13 @@ const VersionToSettingsChangesMap & getSettingsChangesHistory()
218222
{"opentelemetry_start_keeper_trace_probability", "auto", "auto", "New setting"},
219223
{"functions_h3_default_if_invalid", true, false, "A new setting for legacy behaviour to allow invalid inputs to h3 functions"},
220224
});
225+
addSettingsChanges(settings_changes_history, "26.1.3.20001.altinityantalya",
226+
{
227+
// {"iceberg_partition_timezone", "", "", "New setting."},
228+
// {"s3_propagate_credentials_to_other_storages", false, false, "New setting"},
229+
// {"export_merge_tree_part_filename_pattern", "", "{part_name}_{checksum}", "New setting"},
230+
// {"input_format_parquet_use_metadata_cache", true, false, "Obsolete. No-op"}, // https://github.com/Altinity/ClickHouse/pull/586
231+
});
221232
addSettingsChanges(settings_changes_history, "26.1",
222233
{
223234
{"use_statistics", true, true, "Enable this optimization by default."},
@@ -398,6 +409,39 @@ const VersionToSettingsChangesMap & getSettingsChangesHistory()
398409
{"os_threads_nice_value_materialized_view", 0, 0, "New setting."},
399410
{"os_thread_priority", 0, 0, "Alias for os_threads_nice_value_query."},
400411
});
412+
addSettingsChanges(settings_changes_history, "25.8.16.20001.altinityantalya",
413+
{
414+
// {"allow_experimental_database_iceberg", false, true, "Turned ON by default for Antalya."},
415+
// {"allow_experimental_database_unity_catalog", false, true, "Turned ON by default for Antalya."},
416+
// {"allow_experimental_database_glue_catalog", false, true, "Turned ON by default for Antalya."},
417+
// {"allow_database_iceberg", false, true, "Turned ON by default for Antalya (alias)."},
418+
// {"allow_database_unity_catalog", false, true, "Turned ON by default for Antalya (alias)."},
419+
// {"allow_database_glue_catalog", false, true, "Turned ON by default for Antalya (alias)."},
420+
// {"input_format_parquet_use_metadata_cache", true, true, "New setting, turned ON by default"}, // https://github.com/Altinity/ClickHouse/pull/586
421+
// {"iceberg_timezone_for_timestamptz", "UTC", "UTC", "New setting."},
422+
// {"object_storage_remote_initiator", false, false, "New setting."},
423+
// {"allow_experimental_iceberg_read_optimization", true, true, "New setting."},
424+
// {"object_storage_cluster_join_mode", "allow", "allow", "New setting"},
425+
// {"lock_object_storage_task_distribution_ms", 500, 500, "New setting."},
426+
// {"allow_retries_in_cluster_requests", false, false, "New setting"},
427+
// {"allow_experimental_export_merge_tree_part", false, true, "Turned ON by default for Antalya."},
428+
// {"export_merge_tree_part_overwrite_file_if_exists", false, false, "New setting."},
429+
// {"export_merge_tree_partition_force_export", false, false, "New setting."},
430+
// {"export_merge_tree_partition_max_retries", 3, 3, "New setting."},
431+
// {"export_merge_tree_partition_manifest_ttl", 180, 180, "New setting."},
432+
// {"export_merge_tree_part_file_already_exists_policy", "skip", "skip", "New setting."},
433+
// {"hybrid_table_auto_cast_columns", true, true, "New setting to automatically cast Hybrid table columns when segments disagree on types. Default enabled."},
434+
// {"allow_experimental_hybrid_table", false, false, "Added new setting to allow the Hybrid table engine."},
435+
// {"enable_alias_marker", true, true, "New setting."},
436+
// {"export_merge_tree_part_max_bytes_per_file", 0, 0, "New setting."},
437+
// {"export_merge_tree_part_max_rows_per_file", 0, 0, "New setting."},
438+
// {"export_merge_tree_partition_lock_inside_the_task", false, false, "New setting."},
439+
// {"export_merge_tree_partition_system_table_prefer_remote_information", true, true, "New setting."},
440+
// {"export_merge_tree_part_throw_on_pending_mutations", true, true, "New setting."},
441+
// {"export_merge_tree_part_throw_on_pending_patch_parts", true, true, "New setting."},
442+
// {"object_storage_cluster", "", "", "Antalya: New setting"},
443+
// {"object_storage_max_nodes", 0, 0, "Antalya: New setting"},
444+
});
401445
addSettingsChanges(settings_changes_history, "25.8",
402446
{
403447
{"output_format_json_quote_64bit_integers", true, false, "Disable quoting of the 64 bit integers in JSON by default"},

tests/queries/0_stateless/02995_new_settings_history.sh

Lines changed: 41 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,23 @@ fi
2525
# Baselines generated with v26.4.1 (pre-release)
2626
# clickhouse local --query "select name, default from system.settings order by name format TSV" > 02995_settings_26_4_1.tsv
2727
# clickhouse local --query "select name, value from system.merge_tree_settings order by name format TSV" > 02995_merge_tree_settings_settings_26_4_1.tsv
28+
# Previous Antalya release baseline: 26.3.10.20001.altinityantalya (same format as 02995_settings_26_3_1.tsv).
29+
# Settings listed there are considered known; keep empty or generate from previous Antalya build.
30+
31+
# To generate the previous Antalya release baseline:
32+
# docker run --rm --entrypoint clickhouse <antalya_docker_image> \
33+
# local -q "select name, default from system.settings order by name format TSV" \
34+
# > 02995_settings_26_3_10_20001_antalya.tsv
35+
2836
$CLICKHOUSE_LOCAL --query "
2937
WITH old_settings AS
3038
(
3139
SELECT * FROM file('${CUR_DIR}/02995_settings_26_4_1.tsv', 'TSV', 'name String, default String')
3240
),
41+
old_antalya_settings AS
42+
(
43+
SELECT * FROM file('${CUR_DIR}/02995_settings_26_3_10_20001_antalya.tsv', 'TSV', 'name String, default String')
44+
),
3345
old_merge_tree_settings AS
3446
(
3547
SELECT * FROM file('${CUR_DIR}/02995_merge_tree_settings_settings_26_4_1.tsv', 'TSV', 'name String, default String')
@@ -52,7 +64,7 @@ $CLICKHOUSE_LOCAL --query "
5264
)) AND (name NOT IN (
5365
SELECT arrayJoin(tupleElement(changes, 'name'))
5466
FROM system.settings_changes
55-
WHERE type = 'Session' AND splitByChar('.', version)[1]::UInt64 > 26 OR (splitByChar('.', version)[1]::UInt64 == 26 AND splitByChar('.', version)[2]::UInt64 > 4)
67+
WHERE type = 'Session' AND (splitByChar('.', version)[1]::UInt64 > 26 OR (splitByChar('.', version)[1]::UInt64 == 26 AND splitByChar('.', version)[2]::UInt64 > 4) OR position(version, 'altinityantalya') > 0)
5668
))
5769
UNION ALL
5870
(
@@ -64,7 +76,7 @@ $CLICKHOUSE_LOCAL --query "
6476
)) AND (name NOT IN (
6577
SELECT arrayJoin(tupleElement(changes, 'name'))
6678
FROM system.settings_changes
67-
WHERE type = 'MergeTree' AND splitByChar('.', version)[1]::UInt64 > 26 OR (splitByChar('.', version)[1]::UInt64 == 26 AND splitByChar('.', version)[2]::UInt64 > 4)
79+
WHERE type = 'MergeTree' AND (splitByChar('.', version)[1]::UInt64 > 26 OR (splitByChar('.', version)[1]::UInt64 == 26 AND splitByChar('.', version)[2]::UInt64 > 4) OR position(version, 'altinityantalya') > 0)
6880
))
6981
)
7082
UNION ALL
@@ -75,7 +87,7 @@ $CLICKHOUSE_LOCAL --query "
7587
WHERE (new_settings.default != old_settings.default) AND (name NOT IN (
7688
SELECT arrayJoin(tupleElement(changes, 'name'))
7789
FROM system.settings_changes
78-
WHERE type = 'Session' AND splitByChar('.', version)[1]::UInt64 > 26 OR (splitByChar('.', version)[1]::UInt64 == 26 AND splitByChar('.', version)[2]::UInt64 > 4)
90+
WHERE type = 'Session' AND (splitByChar('.', version)[1]::UInt64 > 26 OR (splitByChar('.', version)[1]::UInt64 == 26 AND splitByChar('.', version)[2]::UInt64 > 4) OR position(version, 'altinityantalya') > 0)
7991
)) AND ${IGNORE_SETTINGS_FOR_SANITIZERS}
8092
)
8193
UNION ALL
@@ -86,8 +98,33 @@ $CLICKHOUSE_LOCAL --query "
8698
WHERE (new_merge_tree_settings.default != old_merge_tree_settings.default) AND (name NOT IN (
8799
SELECT arrayJoin(tupleElement(changes, 'name'))
88100
FROM system.settings_changes
89-
WHERE type = 'MergeTree' AND splitByChar('.', version)[1]::UInt64 > 26 OR (splitByChar('.', version)[1]::UInt64 == 26 AND splitByChar('.', version)[2]::UInt64 > 4)
101+
WHERE type = 'MergeTree' AND (splitByChar('.', version)[1]::UInt64 > 26 OR (splitByChar('.', version)[1]::UInt64 == 26 AND splitByChar('.', version)[2]::UInt64 > 4) OR position(version, 'altinityantalya') > 0)
90102
)) AND ${IGNORED_MERGETREE_SETTINGS_FOR_CLOUD}
91103
)
104+
UNION ALL
105+
(
106+
SELECT 'PLEASE ADD THE NEW SETTING TO SettingsChangesHistory.cpp (Antalya): ' || name || ' WAS ADDED'
107+
FROM new_settings
108+
WHERE (name NOT IN (SELECT name FROM old_antalya_settings))
109+
AND (name NOT IN (
110+
SELECT arrayJoin(tupleElement(changes, 'name'))
111+
FROM system.settings_changes
112+
WHERE type = 'Session'
113+
))
114+
AND (SELECT count() FROM old_antalya_settings) > 0
115+
)
116+
UNION ALL
117+
(
118+
SELECT 'PLEASE ADD THE SETTING VALUE CHANGE TO SettingsChangesHistory.cpp (Antalya): ' || name || ' WAS CHANGED FROM ' || old_antalya_settings.default || ' TO ' || new_settings.default
119+
FROM new_settings
120+
JOIN old_antalya_settings ON new_settings.name = old_antalya_settings.name
121+
WHERE (new_settings.default != old_antalya_settings.default)
122+
AND (name NOT IN (
123+
SELECT arrayJoin(tupleElement(changes, 'name'))
124+
FROM system.settings_changes
125+
WHERE type = 'Session'
126+
))
127+
AND ${IGNORE_SETTINGS_FOR_SANITIZERS}
128+
)
92129
)
93130
"

0 commit comments

Comments
 (0)