@@ -64,18 +64,38 @@ static MutationCommand createCommandWithUpdatedColumns(
6464 return res;
6565}
6666
67+ AlterConversions::AlterConversions (
68+ const MutationCommands & mutation_commands_,
69+ const ContextPtr & context)
70+ {
71+ for (const auto & command : mutation_commands_)
72+ addMutationCommand (command, context);
73+
74+ // / Do not throw if there are no mutations or patches.
75+ if (number_of_alter_mutations > 1 )
76+ {
77+ if (!mutation_commands.empty ())
78+ throw Exception (ErrorCodes::NOT_IMPLEMENTED,
79+ " Applying mutations on-fly is not supported with more than one ALTER MODIFY" );
80+ }
81+ }
82+
6783bool AlterConversions::isSupportedDataMutation (MutationCommand::Type type)
6884{
69- using enum MutationCommand::Type;
70- return type == READ_COLUMN || type == UPDATE || type == DELETE;
85+ return type == MutationCommand::UPDATE || type == MutationCommand::DELETE;
86+ }
87+
88+ bool AlterConversions::isSupportedAlterMutation (MutationCommand::Type type)
89+ {
90+ return type == MutationCommand::READ_COLUMN;
7191}
7292
7393bool AlterConversions::isSupportedMetadataMutation (MutationCommand::Type type)
7494{
7595 return type == MutationCommand::Type::RENAME_COLUMN;
7696}
7797
78- void AlterConversions::addMutationCommand (const MutationCommand & command)
98+ void AlterConversions::addMutationCommand (const MutationCommand & command, const ContextPtr & context )
7999{
80100 using enum MutationCommand::Type;
81101
@@ -85,12 +105,12 @@ void AlterConversions::addMutationCommand(const MutationCommand & command)
85105 }
86106 else if (command.type == READ_COLUMN)
87107 {
88- ++number_of_alter_conversions ;
108+ ++number_of_alter_mutations ;
89109 position_of_alter_conversion = mutation_commands.size ();
90110 }
91111 else if (command.type == UPDATE || command.type == DELETE)
92112 {
93- const auto result = findFirstNonDeterministicFunction (command, getContext () );
113+ const auto result = findFirstNonDeterministicFunction (command, context );
94114 if (result.subquery )
95115 throw Exception (ErrorCodes::BAD_ARGUMENTS,
96116 " ALTER UPDATE/ALTER DELETE statement with subquery may be nondeterministic and cannot be applied on fly" );
@@ -105,11 +125,6 @@ void AlterConversions::addMutationCommand(const MutationCommand & command)
105125
106126 mutation_commands.push_back (command);
107127 }
108-
109- // / Do not throw if there are no mutations.
110- if (number_of_alter_conversions > 1 && !mutation_commands.empty ())
111- throw Exception (ErrorCodes::NOT_IMPLEMENTED,
112- " Applying mutations on-fly is not supported with more than one ALTER MODIFY" );
113128}
114129
115130bool AlterConversions::columnHasNewName (const std::string & old_name) const
@@ -157,10 +172,12 @@ std::string AlterConversions::getColumnOldName(const std::string & new_name) con
157172
158173PrewhereExprSteps AlterConversions::getMutationSteps (
159174 const IMergeTreeDataPartInfoForReader & part_info,
160- const NamesAndTypesList & read_columns) const
175+ const NamesAndTypesList & read_columns,
176+ const StorageMetadataPtr & metadata_snapshot,
177+ const ContextPtr & context) const
161178{
162- auto actions_chain = getMutationActions (part_info, read_columns, true );
163- auto settings = ExpressionActionsSettings (getContext () );
179+ auto actions_chain = getMutationActions (part_info, read_columns, metadata_snapshot, context );
180+ auto settings = ExpressionActionsSettings (context );
164181
165182 PrewhereExprSteps steps;
166183 for (size_t i = 0 ; i < actions_chain.size (); ++i)
@@ -191,7 +208,8 @@ PrewhereExprSteps AlterConversions::getMutationSteps(
191208std::vector<MutationActions> AlterConversions::getMutationActions (
192209 const IMergeTreeDataPartInfoForReader & part_info,
193210 const NamesAndTypesList & read_columns,
194- bool can_execute) const
211+ const StorageMetadataPtr & metadata_snapshot,
212+ const ContextPtr & context) const
195213{
196214 if (mutation_commands.empty ())
197215 return {};
@@ -211,19 +229,16 @@ std::vector<MutationActions> AlterConversions::getMutationActions(
211229 storage_read_columns.emplace_back (name_in_storage);
212230 }
213231
214- addColumnsRequiredForMaterialized (storage_read_columns, storage_read_columns_set);
232+ addColumnsRequiredForMaterialized (storage_read_columns, storage_read_columns_set, metadata_snapshot, context );
215233 auto filtered_commands = filterMutationCommands (storage_read_columns, std::move (storage_read_columns_set));
216234
217235 if (filtered_commands.empty ())
218236 return {};
219237
220- if (can_execute)
221- {
222- ProfileEvents::increment (ProfileEvents::ReadTasksWithAppliedMutationsOnFly);
223- ProfileEvents::increment (ProfileEvents::MutationsAppliedOnFlyInAllReadTasks, filtered_commands.size ());
224- }
238+ ProfileEvents::increment (ProfileEvents::ReadTasksWithAppliedMutationsOnFly);
239+ ProfileEvents::increment (ProfileEvents::MutationsAppliedOnFlyInAllReadTasks, filtered_commands.size ());
225240
226- MutationsInterpreter::Settings settings (can_execute );
241+ MutationsInterpreter::Settings settings (true );
227242 settings.return_all_columns = true ;
228243 settings.recalculate_dependencies_of_updated_columns = false ;
229244
@@ -237,13 +252,17 @@ std::vector<MutationActions> AlterConversions::getMutationActions(
237252 metadata_snapshot,
238253 std::move (filtered_commands),
239254 std::move (storage_read_columns),
240- getContext () ,
255+ context ,
241256 settings);
242257
243258 return interpreter.getMutationActions ();
244259}
245260
246- void AlterConversions::addColumnsRequiredForMaterialized (Names & read_columns, NameSet & read_columns_set) const
261+ void AlterConversions::addColumnsRequiredForMaterialized (
262+ Names & read_columns,
263+ NameSet & read_columns_set,
264+ const StorageMetadataPtr & metadata_snapshot,
265+ const ContextPtr & context) const
247266{
248267 NameSet required_source_columns;
249268 const auto & columns_desc = metadata_snapshot->getColumns ();
@@ -255,7 +274,7 @@ void AlterConversions::addColumnsRequiredForMaterialized(Names & read_columns, N
255274 if (default_desc && default_desc->kind == ColumnDefaultKind::Materialized)
256275 {
257276 auto query = default_desc->expression ->clone ();
258- auto syntax_result = TreeRewriter (getContext () ).analyze (query, source_columns);
277+ auto syntax_result = TreeRewriter (context ).analyze (query, source_columns);
259278
260279 for (const auto & dependency : syntax_result->requiredSourceColumns ())
261280 {
@@ -324,4 +343,16 @@ MutationCommands AlterConversions::filterMutationCommands(Names & read_columns,
324343 return filtered_commands;
325344}
326345
346+ void MutationCounters::assertNotNegative () const
347+ {
348+ if (num_data < 0 )
349+ throw Exception (ErrorCodes::LOGICAL_ERROR, " On-fly data mutations counter is negative ({})" , num_data);
350+
351+ if (num_alter < 0 )
352+ throw Exception (ErrorCodes::LOGICAL_ERROR, " On-fly alter mutations counter is negative ({})" , num_alter);
353+
354+ if (num_metadata < 0 )
355+ throw Exception (ErrorCodes::LOGICAL_ERROR, " On-fly metadata mutations counter is negative ({})" , num_metadata);
356+ }
357+
327358}
0 commit comments