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

Method addPrewhereAliasActions

src/Interpreters/InterpreterSelectQuery.cpp:2457–2616  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

2455}
2456
2457void 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

Callers

nothing calls this directly

Calls 15

addTypeConversionToASTFunction · 0.85
setAliasFunction · 0.85
transformFunction · 0.85
TreeRewriterClass · 0.85
ExpressionAnalyzerClass · 0.85
erase_ifFunction · 0.85
tryRestoreColumnMethod · 0.80
ExceptionClass · 0.70
findFunction · 0.50
getColumnsMethod · 0.45
getDefaultMethod · 0.45

Tested by

no test coverage detected