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

Function updatePrewhereOutputsIfNeeded

src/Planner/PlannerJoinTree.cpp:520–582  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

518}
519
520void updatePrewhereOutputsIfNeeded(SelectQueryInfo & table_expression_query_info,
521 const Names & column_names,
522 const StorageSnapshotPtr & storage_snapshot)
523{
524 if (!table_expression_query_info.prewhere_info)
525 return;
526
527 auto & prewhere_actions = table_expression_query_info.prewhere_info->prewhere_actions;
528
529 NameSet required_columns;
530 if (column_names.size() == 1)
531 required_columns.insert(column_names[0]);
532
533 auto & table_expression_modifiers = table_expression_query_info.table_expression_modifiers;
534 if (table_expression_modifiers)
535 {
536 if (table_expression_modifiers->hasSampleSizeRatio()
537 || table_expression_query_info.planner_context->getQueryContext()->getSettingsRef()[Setting::parallel_replicas_count] > 1)
538 {
539 /// We evaluate sampling for Merge lazily so we need to get all the columns
540 if (storage_snapshot->storage.getName() == "Merge")
541 {
542 const auto columns = storage_snapshot->metadata->getColumns().getAll();
543 for (const auto & column : columns)
544 required_columns.insert(column.name);
545 }
546 else
547 {
548 auto columns_required_for_sampling = storage_snapshot->metadata->getColumnsRequiredForSampling();
549 required_columns.insert(columns_required_for_sampling.begin(), columns_required_for_sampling.end());
550 }
551 }
552
553 if (table_expression_modifiers->hasFinal())
554 {
555 auto columns_required_for_final = storage_snapshot->metadata->getColumnsRequiredForFinal();
556 required_columns.insert(columns_required_for_final.begin(), columns_required_for_final.end());
557 }
558 }
559
560 std::unordered_set<const ActionsDAG::Node *> required_output_nodes;
561
562 for (const auto * input : prewhere_actions.getInputs())
563 {
564 if (required_columns.contains(input->result_name))
565 required_output_nodes.insert(input);
566 }
567
568 if (required_output_nodes.empty())
569 return;
570
571 auto & prewhere_outputs = prewhere_actions.getOutputs();
572 for (const auto & output : prewhere_outputs)
573 {
574 auto required_output_node_it = required_output_nodes.find(output);
575 if (required_output_node_it == required_output_nodes.end())
576 continue;
577

Callers 1

Calls 15

hasSampleSizeRatioMethod · 0.80
hasFinalMethod · 0.80
sizeMethod · 0.45
insertMethod · 0.45
getQueryContextMethod · 0.45
getNameMethod · 0.45
getAllMethod · 0.45
getColumnsMethod · 0.45
beginMethod · 0.45
endMethod · 0.45

Tested by

no test coverage detected