@@ -196,6 +196,7 @@ namespace MergeTreeSetting
196196 extern const MergeTreeSettingsBool allow_nullable_key;
197197 extern const MergeTreeSettingsBool allow_remote_fs_zero_copy_replication;
198198 extern const MergeTreeSettingsBool allow_suspicious_indices;
199+ extern const MergeTreeSettingsBool allow_summing_columns_in_partition_or_order_key;
199200 extern const MergeTreeSettingsBool assign_part_uuids;
200201 extern const MergeTreeSettingsBool async_insert;
201202 extern const MergeTreeSettingsBool check_sample_column_is_correct;
@@ -556,7 +557,7 @@ MergeTreeData::MergeTreeData(
556557 setProperties (metadata_, metadata_, !sanity_checks);
557558
558559 // / NOTE: using the same columns list as is read when performing actual merges.
559- merging_params.check (metadata_);
560+ merging_params.check (*settings, metadata_);
560561
561562 if (metadata_.sampling_key .definition_ast != nullptr )
562563 {
@@ -1123,7 +1124,7 @@ void MergeTreeData::checkStoragePolicy(const StoragePolicyPtr & new_storage_poli
11231124}
11241125
11251126
1126- void MergeTreeData::MergingParams::check (const StorageInMemoryMetadata & metadata) const
1127+ void MergeTreeData::MergingParams::check (const MergeTreeSettings & settings, const StorageInMemoryMetadata & metadata) const
11271128{
11281129 const auto columns = metadata.getColumns ().getAllPhysical ();
11291130
@@ -1238,9 +1239,9 @@ void MergeTreeData::MergingParams::check(const StorageInMemoryMetadata & metadat
12381239
12391240 if (mode == MergingParams::Summing)
12401241 {
1241- auto columns_to_sum_copy = columns_to_sum;
1242- std::sort (columns_to_sum_copy .begin (), columns_to_sum_copy .end ());
1243- if (const auto it = std::adjacent_find (columns_to_sum_copy .begin (), columns_to_sum_copy .end ()); it != columns_to_sum_copy .end ())
1242+ auto columns_to_sum_sorted = columns_to_sum;
1243+ std::sort (columns_to_sum_sorted .begin (), columns_to_sum_sorted .end ());
1244+ if (const auto it = std::adjacent_find (columns_to_sum_sorted .begin (), columns_to_sum_sorted .end ()); it != columns_to_sum_sorted .end ())
12441245 throw Exception (ErrorCodes::BAD_ARGUMENTS, " Column {} is listed multiple times in the list of columns to sum" , *it);
12451246
12461247 // / If columns_to_sum are set, then check that such columns exist.
@@ -1257,20 +1258,39 @@ void MergeTreeData::MergingParams::check(const StorageInMemoryMetadata & metadat
12571258 column_to_sum);
12581259 }
12591260
1261+ auto allow_summing_columns_in_partition_or_order_key = settings[MergeTreeSetting::allow_summing_columns_in_partition_or_order_key];
1262+
12601263 // / Check that summing columns are not in partition key.
1261- if (metadata.isPartitionKeyDefined ())
1264+ if (!allow_summing_columns_in_partition_or_order_key && metadata.isPartitionKeyDefined ())
12621265 {
1263- auto partition_key_columns = metadata.getPartitionKey ().column_names ;
1266+ auto partition_key_columns = metadata.getPartitionKey ().expression ->getRequiredColumns ();
1267+ std::sort (partition_key_columns.begin (), partition_key_columns.end ());
12641268
12651269 Names names_intersection;
1266- std::set_intersection (columns_to_sum .begin (), columns_to_sum .end (),
1270+ std::set_intersection (columns_to_sum_sorted .begin (), columns_to_sum_sorted .end (),
12671271 partition_key_columns.begin (), partition_key_columns.end (),
12681272 std::back_inserter (names_intersection));
12691273
12701274 if (!names_intersection.empty ())
12711275 throw Exception (ErrorCodes::BAD_ARGUMENTS, " Columns: {} listed both in columns to sum and in partition key. "
12721276 " That is not allowed." , boost::algorithm::join (names_intersection, " , " ));
12731277 }
1278+
1279+ // / Check that summing columns are not in sorting key.
1280+ if (!allow_summing_columns_in_partition_or_order_key && metadata.isSortingKeyDefined ())
1281+ {
1282+ auto sorting_key_columns = metadata.getSortingKey ().expression ->getRequiredColumns ();
1283+ std::sort (sorting_key_columns.begin (), sorting_key_columns.end ());
1284+
1285+ Names names_intersection;
1286+ std::set_intersection (columns_to_sum_sorted.begin (), columns_to_sum_sorted.end (),
1287+ sorting_key_columns.begin (), sorting_key_columns.end (),
1288+ std::back_inserter (names_intersection));
1289+
1290+ if (!names_intersection.empty ())
1291+ throw Exception (ErrorCodes::BAD_ARGUMENTS, " Columns: {} listed both in columns to sum and in sorting key. "
1292+ " That is not allowed." , boost::algorithm::join (names_intersection, " , " ));
1293+ }
12741294 }
12751295
12761296 if (mode == MergingParams::Replacing)
0 commit comments