| 2455 | } |
| 2456 | |
| 2457 | void InterpreterSelectQuery::addPrewhereAliasActions() |
| 2458 | { |
| 2459 | auto & row_level_filter = analysis_result.row_policy_info; |
| 2460 | auto & prewhere_info = analysis_result.prewhere_info; |
| 2461 | auto & columns_to_remove_after_prewhere = analysis_result.columns_to_remove_after_prewhere; |
| 2462 | |
| 2463 | /// Detect, if ALIAS columns are required for query execution |
| 2464 | auto alias_columns_required = false; |
| 2465 | const ColumnsDescription & storage_columns = metadata_snapshot->getColumns(); |
| 2466 | for (const auto & column_name : required_columns) |
| 2467 | { |
| 2468 | auto column_default = storage_columns.getDefault(column_name); |
| 2469 | if (column_default && column_default->kind == ColumnDefaultKind::Alias) |
| 2470 | { |
| 2471 | alias_columns_required = true; |
| 2472 | break; |
| 2473 | } |
| 2474 | } |
| 2475 | |
| 2476 | /// Set of all (including ALIAS) required columns for PREWHERE |
| 2477 | auto get_prewhere_columns = [&]() |
| 2478 | { |
| 2479 | NameSet columns; |
| 2480 | |
| 2481 | if (prewhere_info) |
| 2482 | { |
| 2483 | /// Get some columns directly from PREWHERE expression actions |
| 2484 | auto prewhere_required_columns = prewhere_info->prewhere_actions.getRequiredColumns().getNames(); |
| 2485 | columns.insert(prewhere_required_columns.begin(), prewhere_required_columns.end()); |
| 2486 | } |
| 2487 | |
| 2488 | if (row_level_filter) |
| 2489 | { |
| 2490 | auto row_level_required_columns = row_level_filter->actions.getRequiredColumns().getNames(); |
| 2491 | columns.insert(row_level_required_columns.begin(), row_level_required_columns.end()); |
| 2492 | } |
| 2493 | |
| 2494 | return columns; |
| 2495 | }; |
| 2496 | |
| 2497 | /// There are multiple sources of required columns: |
| 2498 | /// - raw required columns, |
| 2499 | /// - columns deduced from ALIAS columns, |
| 2500 | /// - raw required columns from PREWHERE, |
| 2501 | /// - columns deduced from ALIAS columns from PREWHERE. |
| 2502 | /// PREWHERE is a special case, since we need to resolve it and pass directly to `IStorage::read()` |
| 2503 | /// before any other executions. |
| 2504 | if (alias_columns_required) |
| 2505 | { |
| 2506 | NameSet required_columns_from_prewhere = get_prewhere_columns(); |
| 2507 | NameSet required_aliases_from_prewhere; /// Set of ALIAS required columns for PREWHERE |
| 2508 | |
| 2509 | /// Expression, that contains all raw required columns |
| 2510 | ASTPtr required_columns_all_expr = make_intrusive<ASTExpressionList>(); |
| 2511 | |
| 2512 | /// Expression, that contains raw required columns for PREWHERE |
| 2513 | ASTPtr required_columns_from_prewhere_expr = make_intrusive<ASTExpressionList>(); |
| 2514 |
nothing calls this directly
no test coverage detected