Skip to content

Commit f306431

Browse files
authored
Merge branch 'releases/25.3.14' into backports/releases/25.3.14/82900
2 parents b695bbb + c287551 commit f306431

20 files changed

Lines changed: 203 additions & 27 deletions

.github/workflows/release_branches.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -444,7 +444,7 @@ jobs:
444444
secrets: inherit
445445
with:
446446
runner_type: altinity-on-demand, altinity-regression-tester
447-
commit: b8e6b17fdd6f6c0db1234c23eca5294c9400a196
447+
commit: release
448448
arch: release
449449
build_sha: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.sha }}
450450
timeout_minutes: 300
@@ -455,7 +455,7 @@ jobs:
455455
secrets: inherit
456456
with:
457457
runner_type: altinity-on-demand, altinity-regression-tester-aarch64
458-
commit: b8e6b17fdd6f6c0db1234c23eca5294c9400a196
458+
commit: release
459459
arch: aarch64
460460
build_sha: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.sha }}
461461
timeout_minutes: 300

src/Interpreters/ActionsDAG.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -210,11 +210,11 @@ ActionsDAG::ActionsDAG(const NamesAndTypesList & inputs_)
210210
outputs.push_back(&addInput(input.name, input.type));
211211
}
212212

213-
ActionsDAG::ActionsDAG(const ColumnsWithTypeAndName & inputs_)
213+
ActionsDAG::ActionsDAG(const ColumnsWithTypeAndName & inputs_, bool duplicate_const_columns)
214214
{
215215
for (const auto & input : inputs_)
216216
{
217-
if (input.column && isColumnConst(*input.column))
217+
if (input.column && isColumnConst(*input.column) && duplicate_const_columns)
218218
{
219219
addInput(input);
220220

src/Interpreters/ActionsDAG.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ class ActionsDAG
115115
ActionsDAG & operator=(ActionsDAG &&) = default;
116116
ActionsDAG & operator=(const ActionsDAG &) = delete;
117117
explicit ActionsDAG(const NamesAndTypesList & inputs_);
118-
explicit ActionsDAG(const ColumnsWithTypeAndName & inputs_);
118+
explicit ActionsDAG(const ColumnsWithTypeAndName & inputs_, bool duplicate_const_columns = true);
119119

120120
const Nodes & getNodes() const { return nodes; }
121121
static Nodes detachNodes(ActionsDAG && dag) { return std::move(dag.nodes); }

src/Planner/PlannerExpressionAnalysis.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,9 @@ std::optional<AggregationAnalysisResult> analyzeAggregation(const QueryTreeNodeP
125125
Names aggregation_keys;
126126

127127
ActionsAndProjectInputsFlagPtr before_aggregation_actions = std::make_shared<ActionsAndProjectInputsFlag>();
128-
before_aggregation_actions->dag = ActionsDAG(input_columns);
128+
/// Here it is OK to materialize const columns: if column is used in GROUP BY, it may be expected to become non-const
129+
/// See https://github.com/ClickHouse/ClickHouse/issues/70655 for example
130+
before_aggregation_actions->dag = ActionsDAG(input_columns, false);
129131
before_aggregation_actions->dag.getOutputs().clear();
130132

131133
std::unordered_set<std::string_view> before_aggregation_actions_output_node_names;

src/Storages/MergeTree/Compaction/MergePredicates/DistributedMergePredicate.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,9 @@ class DistributedMergePredicate : public IMergePredicate
7676
if (left.info.partition_id != right.info.partition_id)
7777
return std::unexpected(PreformattedMessage::create("Parts {} and {} belong to different partitions", left.name, right.name));
7878

79+
if (left.is_in_volume_where_merges_avoid || right.is_in_volume_where_merges_avoid)
80+
return std::unexpected(PreformattedMessage::create("One of parts ({}, {}) lies on volume where merges should be avoided", left.name, right.name));
81+
7982
int64_t left_max_block = left.info.max_block;
8083
int64_t right_min_block = right.info.min_block;
8184
chassert(left_max_block < right_min_block);

src/Storages/MergeTree/Compaction/MergePredicates/MergeTreeMergePredicate.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@ std::expected<void, PreformattedMessage> MergeTreeMergePredicate::canMergeParts(
1616
if (left.info.partition_id != right.info.partition_id)
1717
return std::unexpected(PreformattedMessage::create("Parts {} and {} belong to different partitions", left.name, right.name));
1818

19+
if (left.is_in_volume_where_merges_avoid || right.is_in_volume_where_merges_avoid)
20+
return std::unexpected(PreformattedMessage::create("One of parts ({}, {}) lies on volume where merges should be avoided", left.name, right.name));
21+
1922
if (left.projection_names != right.projection_names)
2023
return std::unexpected(PreformattedMessage::create(
2124
"Parts have different projection sets: {{}} in {} and {{}} in {}",

src/Storages/MergeTree/Compaction/MergeSelectors/TTLMergeSelector.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,9 @@ time_t TTLRowDeleteMergeSelector::getTTLForPart(const PartProperties & part) con
147147

148148
bool TTLRowDeleteMergeSelector::canConsiderPart(const PartProperties & part) const
149149
{
150+
if (part.is_in_volume_where_merges_avoid)
151+
return false;
152+
150153
if (!part.general_ttl_info.has_value())
151154
return false;
152155

@@ -165,6 +168,9 @@ time_t TTLRecompressMergeSelector::getTTLForPart(const PartProperties & part) co
165168

166169
bool TTLRecompressMergeSelector::canConsiderPart(const PartProperties & part) const
167170
{
171+
if (part.is_in_volume_where_merges_avoid)
172+
return false;
173+
168174
if (!part.recompression_ttl_info.has_value())
169175
return false;
170176

src/Storages/MergeTree/Compaction/PartProperties.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,13 +66,15 @@ std::set<std::string> getCalculatedProjectionNames(const MergeTreeDataPartPtr &
6666
PartProperties buildPartProperties(
6767
const MergeTreeDataPartPtr & part,
6868
const StorageMetadataPtr & metadata_snapshot,
69+
const StoragePolicyPtr & storage_policy,
6970
time_t current_time)
7071
{
7172
return PartProperties{
7273
.name = part->name,
7374
.info = part->info,
7475
.projection_names = getCalculatedProjectionNames(part),
7576
.all_ttl_calculated_if_any = part->checkAllTTLCalculated(metadata_snapshot),
77+
.is_in_volume_where_merges_avoid = !part->shallParticipateInMerges(storage_policy),
7678
.size = part->getExistingBytesOnDisk(),
7779
.age = current_time - part->modification_time,
7880
.general_ttl_info = buildGeneralTTLInfo(metadata_snapshot, part),

src/Storages/MergeTree/Compaction/PartProperties.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
#include <Storages/MergeTree/IMergeTreeDataPart.h>
44

5+
#include <Disks/IStoragePolicy.h>
6+
57
#include <Core/UUID.h>
68

79
#include <optional>
@@ -18,6 +20,7 @@ struct PartProperties
1820
const std::set<std::string> projection_names = {};
1921

2022
const bool all_ttl_calculated_if_any = false;
23+
const bool is_in_volume_where_merges_avoid = false;
2124

2225
/// Size of data part in bytes.
2326
const size_t size = 0;
@@ -50,6 +53,7 @@ using PartsRangeView = std::span<const PartProperties>;
5053
PartProperties buildPartProperties(
5154
const MergeTreeDataPartPtr & part,
5255
const StorageMetadataPtr & metadata_snapshot,
56+
const StoragePolicyPtr & storage_policy,
5357
time_t current_time);
5458

5559
}

src/Storages/MergeTree/Compaction/PartsCollectors/Common.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,10 @@ namespace DB
66
{
77

88
PartsRanges constructPartsRanges(
9-
std::vector<MergeTreeDataPartsVector> && ranges, const StorageMetadataPtr & metadata_snapshot, const time_t & current_time)
9+
std::vector<MergeTreeDataPartsVector> && ranges,
10+
const StorageMetadataPtr & metadata_snapshot,
11+
const StoragePolicyPtr & storage_policy,
12+
const time_t & current_time)
1013
{
1114
PartsRanges properties_ranges;
1215
properties_ranges.reserve(ranges.size());
@@ -17,7 +20,7 @@ PartsRanges constructPartsRanges(
1720
properties_ranges.reserve(range.size());
1821

1922
for (const auto & part : range)
20-
properties_range.push_back(buildPartProperties(part, metadata_snapshot, current_time));
23+
properties_range.push_back(buildPartProperties(part, metadata_snapshot, storage_policy, current_time));
2124

2225
properties_ranges.push_back(std::move(properties_range));
2326
}

0 commit comments

Comments
 (0)