| 604 | } |
| 605 | |
| 606 | std::optional<FilterDAGInfo> buildCustomKeyFilterIfNeeded(const StoragePtr & storage, |
| 607 | SelectQueryInfo & table_expression_query_info, |
| 608 | PlannerContextPtr & planner_context) |
| 609 | { |
| 610 | const auto & query_context = planner_context->getQueryContext(); |
| 611 | const auto & settings = query_context->getSettingsRef(); |
| 612 | |
| 613 | if (settings[Setting::parallel_replicas_count] <= 1 || settings[Setting::parallel_replicas_custom_key].value.empty()) |
| 614 | return {}; |
| 615 | |
| 616 | auto custom_key_ast = parseCustomKeyForTable(settings[Setting::parallel_replicas_custom_key], *query_context); |
| 617 | if (!custom_key_ast) |
| 618 | throw DB::Exception( |
| 619 | ErrorCodes::BAD_ARGUMENTS, |
| 620 | "Parallel replicas processing with custom_key has been requested " |
| 621 | "(setting 'max_parallel_replicas'), but the table does not have custom_key defined for it " |
| 622 | " or it's invalid (setting 'parallel_replicas_custom_key')"); |
| 623 | |
| 624 | LOG_TRACE(getLogger("Planner"), "Processing query on a replica using custom_key '{}'", settings[Setting::parallel_replicas_custom_key].value); |
| 625 | |
| 626 | auto metadata_snapshot = storage->getInMemoryMetadataPtr(query_context, false); |
| 627 | auto parallel_replicas_custom_filter_ast = getCustomKeyFilterForParallelReplica( |
| 628 | settings[Setting::parallel_replicas_count], |
| 629 | settings[Setting::parallel_replica_offset], |
| 630 | std::move(custom_key_ast), |
| 631 | {settings[Setting::parallel_replicas_mode], |
| 632 | settings[Setting::parallel_replicas_custom_key_range_lower], |
| 633 | settings[Setting::parallel_replicas_custom_key_range_upper]}, |
| 634 | metadata_snapshot->columns, |
| 635 | query_context); |
| 636 | |
| 637 | return buildFilterInfo(parallel_replicas_custom_filter_ast, table_expression_query_info.table_expression, planner_context); |
| 638 | } |
| 639 | |
| 640 | /// Parse `additional_table_filters` for this table expression and assign the AST into |
| 641 | /// `table_expression_query_info.additional_filter_ast`. This is the pure, side-effect-free |
no test coverage detected