MCPcopy Create free account
hub / github.com/ClickHouse/ClickHouse / addQueryTreePasses

Function addQueryTreePasses

src/Analyzer/QueryTreePassManager.cpp:268–353  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

266}
267
268void addQueryTreePasses(QueryTreePassManager & manager, bool only_analyze)
269{
270 manager.addPass(std::make_unique<QueryAnalysisPass>(only_analyze));
271 manager.addPass(std::make_unique<GroupingFunctionsResolvePass>());
272 manager.addPass(std::make_unique<AutoFinalOnQueryPass>());
273 /// This pass should be run for the secondary queries
274 /// to ensure that the only required columns are read from VIEWs on the shards.
275 manager.addPass(std::make_unique<RemoveUnusedProjectionColumnsPass>());
276 manager.addPass(std::make_unique<PruneArrayJoinColumnsPass>());
277
278 manager.addPass(std::make_unique<DictGetTupleElementPass>());
279 manager.addPass(std::make_unique<ConvertEmptyStringComparisonToFunctionPass>());
280 manager.addPass(std::make_unique<FunctionToSubcolumnsPass>());
281
282 manager.addPass(std::make_unique<ConvertLogicalExpressionToCNFPass>());
283 manager.addPass(std::make_unique<RegexpFunctionRewritePass>());
284
285 manager.addPass(std::make_unique<RewriteSumFunctionWithSumAndCountPass>());
286 manager.addPass(std::make_unique<CountDistinctPass>());
287 manager.addPass(std::make_unique<UniqToCountPass>());
288 manager.addPass(std::make_unique<RewriteArrayExistsToHasPass>());
289 manager.addPass(std::make_unique<RewriteHasToInPass>());
290 manager.addPass(std::make_unique<NormalizeCountVariantsPass>());
291
292 manager.addPass(std::make_unique<DistanceTransposedPartialReadsPass>());
293
294 /// should before AggregateFunctionsArithmeticOperationsPass
295 manager.addPass(std::make_unique<AggregateFunctionOfGroupByKeysPass>());
296
297 manager.addPass(std::make_unique<AggregateFunctionsArithmeticOperationsPass>());
298 manager.addPass(std::make_unique<UniqInjectiveFunctionsEliminationPass>());
299
300 // Should run before optimization of GROUP BY keys to allow the removal of
301 // toString function.
302 manager.addPass(std::make_unique<IfTransformStringsToEnumPass>());
303
304 /// These passes can rewrite a predicate so that it depends on base columns instead of
305 /// the derived expression that appears in `GROUP BY`. They must run before
306 /// `OptimizeGroupByFunctionKeysPass` and `OptimizeGroupByInjectiveFunctionsPass`,
307 /// because those passes remove grouping keys based on the current expression tree.
308 /// For example, `SELECT toYear(d), toYear(d) = 2024, count() FROM ... GROUP BY ALL`:
309 /// `OptimizeGroupByFunctionKeysPass` can keep only `toYear(d)` as the grouping key,
310 /// and if `OptimizeDateOrDateTimeConverterWithPreimagePass` runs later it rewrites
311 /// `toYear(d) = 2024` to a range on raw `d`. After aggregation only `toYear(d)` and
312 /// `count()` remain, so the final projection would need `d` that is no longer present.
313 manager.addPass(std::make_unique<InverseDictionaryLookupPass>());
314 manager.addPass(std::make_unique<OptimizeDateOrDateTimeConverterWithPreimagePass>());
315 manager.addPass(std::make_unique<ComparisonTupleEliminationPass>());
316
317 manager.addPass(std::make_unique<OptimizeGroupByFunctionKeysPass>());
318 manager.addPass(std::make_unique<OptimizeGroupByInjectiveFunctionsPass>());
319
320 /// The order here is important as we want to keep collapsing in order
321 manager.addPass(std::make_unique<MultiIfToIfPass>());
322 manager.addPass(std::make_unique<IfConstantConditionPass>());
323 manager.addPass(std::make_unique<IfChainToMultiIfPass>());
324 manager.addPass(std::make_unique<RewriteAggregateFunctionWithIfPass>());
325 manager.addPass(std::make_unique<SumIfToCountIfPass>());

Calls 1

addPassMethod · 0.80

Tested by 2

TESTFunction · 0.68
checkNewAnalyzerFunction · 0.68