| 605 | } |
| 606 | |
| 607 | void TableScanExecutor::prunePartsByIndex(MergeTreeData::DataPartsVector & parts) const |
| 608 | { |
| 609 | if (parts.empty()) |
| 610 | return; |
| 611 | |
| 612 | auto part_values = MergeTreeDataSelectExecutor::filterPartsByVirtualColumns(storage, parts, select_query_info, context); |
| 613 | |
| 614 | if (part_values && part_values->empty()) |
| 615 | { |
| 616 | parts.clear(); |
| 617 | return; |
| 618 | } |
| 619 | |
| 620 | ReadFromMergeTree::AnalysisResult result; |
| 621 | if (select_query_info.partition_filter) |
| 622 | { |
| 623 | /// If partition filter exist reconstruct query info |
| 624 | SelectQueryOptions options; |
| 625 | auto mutable_context = Context::createCopy(context); |
| 626 | ASTPtr copy_select = select_query_info.query->clone(); |
| 627 | auto & copy_select_query = copy_select->as<ASTSelectQuery &>(); |
| 628 | std::vector<String> setting_names{"enable_partition_filter_push_down"}; |
| 629 | for (auto & setting_name : setting_names) |
| 630 | { |
| 631 | SettingChange setting; |
| 632 | setting.name = setting_name; |
| 633 | setting.value = Field(false); |
| 634 | if (copy_select_query.settings()) |
| 635 | { |
| 636 | auto * set_ast = copy_select_query.settings()->as<ASTSetQuery>(); |
| 637 | auto it = std::find_if(set_ast->changes.begin(), set_ast->changes.end(), [&](const SettingChange & change) { |
| 638 | return change.name == setting_name; |
| 639 | }); |
| 640 | if (it != set_ast->changes.end()) |
| 641 | it->value = Field(false); |
| 642 | else |
| 643 | set_ast->changes.emplace_back(setting); |
| 644 | } |
| 645 | else |
| 646 | { |
| 647 | ASTSetQuery set_ast; |
| 648 | set_ast.is_standalone = false; |
| 649 | set_ast.changes.emplace_back(setting); |
| 650 | copy_select_query.setExpression(ASTSelectQuery::Expression::SETTINGS, std::make_shared<ASTSetQuery>(set_ast)); |
| 651 | } |
| 652 | } |
| 653 | |
| 654 | copy_select_query.setExpression(ASTSelectQuery::Expression::WHERE, select_query_info.partition_filter->clone()); |
| 655 | copy_select_query.setExpression(ASTSelectQuery::Expression::PREWHERE, nullptr); |
| 656 | auto interpreter = std::make_shared<InterpreterSelectQuery>(copy_select, mutable_context, options); |
| 657 | interpreter->execute(); |
| 658 | LOG_TRACE(log, "Construct partition filter query {}", queryToString(copy_select)); |
| 659 | MergeTreeDataSelectExecutor::filterPartsByPartition( |
| 660 | parts, part_values, storage_metadata, storage, interpreter->getQueryInfo(), context, max_added_blocks.get(), log, result.index_stats); |
| 661 | } |
| 662 | else |
| 663 | { |
| 664 | MergeTreeDataSelectExecutor::filterPartsByPartition( |
nothing calls this directly
no test coverage detected