Merge pull request #12347 from ClickHouse/cherrypick/20.5/ffdd6e1af69… · ClickHouse/ClickHouse@f8c9b8a · GitHub
Skip to content

Commit f8c9b8a

Browse files
Merge pull request #12347 from ClickHouse/cherrypick/20.5/ffdd6e1af6940e62ee261882363efdceea5b60a3
Cherry pick #12173 to 20.5: Exclude partition key columns from SummingMergeTree
2 parents 4d63b83 + 5b0ada4 commit f8c9b8a

16 files changed

Lines changed: 123 additions & 23 deletions

programs/copier/Internals.cpp

Lines changed: 0 additions & 11 deletions

programs/copier/Internals.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
#include <Columns/ColumnString.h>
4141
#include <Columns/ColumnsNumber.h>
4242
#include <DataTypes/DataTypeString.h>
43+
#include <DataTypes/NestedUtils.h>
4344
#include <Parsers/ParserCreateQuery.h>
4445
#include <Parsers/parseQuery.h>
4546
#include <Parsers/ParserQuery.h>
@@ -197,8 +198,6 @@ ASTPtr extractPrimaryKey(const ASTPtr & storage_ast);
197198

198199
ASTPtr extractOrderBy(const ASTPtr & storage_ast);
199200

200-
String createCommaSeparatedStringFrom(const Names & names);
201-
202201
Names extractPrimaryKeyColumnNames(const ASTPtr & storage_ast);
203202

204203
String extractReplicatedTableZookeeperPath(const ASTPtr & storage_ast);

programs/copier/TaskTableAndShard.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -268,7 +268,7 @@ inline TaskTable::TaskTable(TaskCluster & parent, const Poco::Util::AbstractConf
268268
ParserStorage parser_storage;
269269
engine_push_ast = parseQuery(parser_storage, engine_push_str, 0, DBMS_DEFAULT_MAX_PARSER_DEPTH);
270270
engine_push_partition_key_ast = extractPartitionKey(engine_push_ast);
271-
primary_key_comma_separated = createCommaSeparatedStringFrom(extractPrimaryKeyColumnNames(engine_push_ast));
271+
primary_key_comma_separated = Nested::createCommaSeparatedStringFrom(extractPrimaryKeyColumnNames(engine_push_ast));
272272
engine_push_zk_path = extractReplicatedTableZookeeperPath(engine_push_ast);
273273
}
274274

src/DataTypes/NestedUtils.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,17 @@ std::pair<std::string, std::string> splitName(const std::string & name)
7070
return {{ begin, first_end }, { second_begin, end }};
7171
}
7272

73+
std::string createCommaSeparatedStringFrom(const Names & names)
74+
{
75+
std::ostringstream ss;
76+
if (!names.empty())
77+
{
78+
std::copy(names.begin(), std::prev(names.end()), std::ostream_iterator<std::string>(ss, ", "));
79+
ss << names.back();
80+
}
81+
return ss.str();
82+
}
83+
7384

7485
std::string extractTableName(const std::string & nested_name)
7586
{

src/DataTypes/NestedUtils.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ namespace Nested
1313

1414
std::pair<std::string, std::string> splitName(const std::string & name);
1515

16+
std::string createCommaSeparatedStringFrom(const Names & names);
17+
1618
/// Returns the prefix of the name to the first '.'. Or the name is unchanged if there is no dot.
1719
std::string extractTableName(const std::string & nested_name);
1820

src/Processors/Merges/Algorithms/SummingSortedAlgorithm.cpp

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,12 @@ static bool isInPrimaryKey(const SortDescription & description, const std::strin
9494
return false;
9595
}
9696

97+
static bool isInPartitionKey(const std::string & column_name, const Names & partition_key_columns)
98+
{
99+
auto is_in_partition_key = std::find(partition_key_columns.begin(), partition_key_columns.end(), column_name);
100+
return is_in_partition_key != partition_key_columns.end();
101+
}
102+
97103
/// Returns true if merge result is not empty
98104
static bool mergeMap(const SummingSortedAlgorithm::MapDescription & desc,
99105
Row & row, const ColumnRawPtrs & raw_columns, size_t row_number)
@@ -181,7 +187,8 @@ static bool mergeMap(const SummingSortedAlgorithm::MapDescription & desc,
181187
static SummingSortedAlgorithm::ColumnsDefinition defineColumns(
182188
const Block & header,
183189
const SortDescription & description,
184-
const Names & column_names_to_sum)
190+
const Names & column_names_to_sum,
191+
const Names & partition_key_columns)
185192
{
186193
size_t num_columns = header.columns();
187194
SummingSortedAlgorithm::ColumnsDefinition def;
@@ -223,8 +230,8 @@ static SummingSortedAlgorithm::ColumnsDefinition defineColumns(
223230
continue;
224231
}
225232

226-
/// Are they inside the PK?
227-
if (isInPrimaryKey(description, column.name, i))
233+
/// Are they inside the primary key or partiton key?
234+
if (isInPrimaryKey(description, column.name, i) || isInPartitionKey(column.name, partition_key_columns))
228235
{
229236
def.column_numbers_not_to_aggregate.push_back(i);
230237
continue;
@@ -617,9 +624,10 @@ SummingSortedAlgorithm::SummingSortedAlgorithm(
617624
const Block & header, size_t num_inputs,
618625
SortDescription description_,
619626
const Names & column_names_to_sum,
627+
const Names & partition_key_columns,
620628
size_t max_block_size)
621629
: IMergingAlgorithmWithDelayedChunk(num_inputs, std::move(description_))
622-
, columns_definition(defineColumns(header, description, column_names_to_sum))
630+
, columns_definition(defineColumns(header, description, column_names_to_sum, partition_key_columns))
623631
, merged_data(getMergedDataColumns(header, columns_definition), max_block_size, columns_definition)
624632
{
625633
}

src/Processors/Merges/Algorithms/SummingSortedAlgorithm.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ class SummingSortedAlgorithm final : public IMergingAlgorithmWithDelayedChunk
2020
SortDescription description_,
2121
/// List of columns to be summed. If empty, all numeric columns that are not in the description are taken.
2222
const Names & column_names_to_sum,
23+
/// List of partition key columns. They have to be excluded.
24+
const Names & partition_key_columns,
2325
size_t max_block_size);
2426

2527
void initialize(Inputs inputs) override;

src/Processors/Merges/SummingSortedTransform.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,15 @@ class SummingSortedTransform final : public IMergingTransform<SummingSortedAlgor
1616
SortDescription description_,
1717
/// List of columns to be summed. If empty, all numeric columns that are not in the description are taken.
1818
const Names & column_names_to_sum,
19+
const Names & partition_key_columns,
1920
size_t max_block_size)
2021
: IMergingTransform(
2122
num_inputs, header, header, true,
2223
header,
2324
num_inputs,
2425
std::move(description_),
2526
column_names_to_sum,
27+
partition_key_columns,
2628
max_block_size)
2729
{
2830
}

src/Storages/MergeTree/MergeTreeData.cpp

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,20 @@ MergeTreeData::MergeTreeData(
185185
min_format_version = MERGE_TREE_DATA_MIN_FORMAT_VERSION_WITH_CUSTOM_PARTITIONING;
186186
}
187187

188+
setProperties(metadata_, metadata_, attach);
189+
const auto settings = getSettings();
190+
191+
/// NOTE: using the same columns list as is read when performing actual merges.
192+
merging_params.check(metadata_);
193+
194+
if (metadata_.sampling_key.definition_ast != nullptr)
195+
{
196+
const auto & pk_sample_block = metadata_.getPrimaryKey().sample_block;
197+
if (!pk_sample_block.has(metadata_.sampling_key.column_names[0]) && !attach
198+
&& !settings->compatibility_allow_sampling_expression_not_in_primary_key) /// This is for backward compatibility.
199+
throw Exception("Sampling expression must be present in the primary key", ErrorCodes::BAD_ARGUMENTS);
200+
}
201+
188202
setTTLExpressions(metadata_);
189203

190204
/// format_file always contained on any data path
@@ -540,8 +554,10 @@ void MergeTreeData::checkStoragePolicy(const StoragePolicyPtr & new_storage_poli
540554
}
541555

542556

543-
void MergeTreeData::MergingParams::check(const NamesAndTypesList & columns) const
557+
void MergeTreeData::MergingParams::check(const StorageInMemoryMetadata & metadata) const
544558
{
559+
const auto columns = metadata.getColumns().getAllPhysical();
560+
545561
if (!sign_column.empty() && mode != MergingParams::Collapsing && mode != MergingParams::VersionedCollapsing)
546562
throw Exception("Sign column for MergeTree cannot be specified in modes except Collapsing or VersionedCollapsing.",
547563
ErrorCodes::LOGICAL_ERROR);
@@ -626,6 +642,21 @@ void MergeTreeData::MergingParams::check(const NamesAndTypesList & columns) cons
626642
throw Exception(
627643
"Column " + column_to_sum + " listed in columns to sum does not exist in table declaration.", ErrorCodes::NO_SUCH_COLUMN_IN_TABLE);
628644
}
645+
646+
/// Check that summing columns are not in partition key.
647+
if (metadata.isPartitionKeyDefined())
648+
{
649+
auto partition_key_columns = metadata.getPartitionKey().column_names;
650+
651+
Names names_intersection;
652+
std::set_intersection(columns_to_sum.begin(), columns_to_sum.end(),
653+
partition_key_columns.begin(), partition_key_columns.end(),
654+
std::back_inserter(names_intersection));
655+
656+
if (!names_intersection.empty())
657+
throw Exception("Colums: " + Nested::createCommaSeparatedStringFrom(names_intersection) +
658+
" listed both in colums to sum and in partition key. That is not allowed.", ErrorCodes::BAD_ARGUMENTS);
659+
}
629660
}
630661

631662
if (mode == MergingParams::Replacing)
@@ -657,7 +688,6 @@ String MergeTreeData::MergingParams::getModeName() const
657688
__builtin_unreachable();
658689
}
659690

660-
661691
Int64 MergeTreeData::getMaxBlockNumber() const
662692
{
663693
auto lock = lockParts();

src/Storages/MergeTree/MergeTreeData.h

Lines changed: 1 addition & 1 deletion

0 commit comments

Comments
 (0)