| 266 | } |
| 267 | |
| 268 | void 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>()); |