| 42 | } |
| 43 | |
| 44 | BlockIO InterpreterReproduceQuery::execute() |
| 45 | { |
| 46 | auto reproduce_query = query_ptr->as<ASTReproduceQuery &>(); |
| 47 | |
| 48 | std::string zip_path = getStringFromLiteral(reproduce_query.reproducePath()); |
| 49 | PlanReproducer reproducer(zip_path, getContext()); |
| 50 | |
| 51 | if (auto cluster = reproduce_query.cluster()) |
| 52 | { |
| 53 | reproducer.setCluster(cluster->as<ASTIdentifier &>().name()); |
| 54 | } |
| 55 | |
| 56 | // reproduce ddl |
| 57 | if (reproduce_query.mode == ASTReproduceQuery::Mode::DDL) |
| 58 | { |
| 59 | return reproduceDDLImpl(std::move(reproducer)); |
| 60 | } |
| 61 | |
| 62 | // get queries to reproduce |
| 63 | std::vector<PlanReproducer::Query> queries_to_reproduce{}; |
| 64 | if (ASTPtr subquery = reproduce_query.subquery()) |
| 65 | { |
| 66 | queries_to_reproduce.emplace_back(PlanReproducer::Query{/*query_id=*/"", |
| 67 | /*query=*/serializeAST(*subquery), |
| 68 | /*current_database=*/getContext()->getCurrentDatabase(), |
| 69 | SettingsChanges{}, std::nullopt, std::nullopt}); |
| 70 | } |
| 71 | else if (ASTPtr query_id_literal = reproduce_query.queryId()) |
| 72 | { |
| 73 | queries_to_reproduce.emplace_back(reproducer.getQuery(getStringFromLiteral(query_id_literal))); |
| 74 | } |
| 75 | else |
| 76 | { |
| 77 | if (!reproducer.getQueries()) |
| 78 | throw Exception("there is no query to reproduce in " + zip_path, ErrorCodes::BAD_ARGUMENTS); |
| 79 | for (const auto & query_id : reproducer.getQueries()->getNames()) |
| 80 | queries_to_reproduce.emplace_back(reproducer.getQuery(query_id)); |
| 81 | } |
| 82 | |
| 83 | // get enforced settings |
| 84 | SettingsChanges enforced_settings; |
| 85 | if (reproduce_query.settingsChanges()) |
| 86 | enforced_settings = reproduce_query.settingsChanges()->as<ASTSetQuery &>().changes; |
| 87 | |
| 88 | if (reproduce_query.mode == ASTReproduceQuery::Mode::EXPLAIN) |
| 89 | { |
| 90 | return reproduceExplainImpl(std::move(reproducer), |
| 91 | std::move(queries_to_reproduce), |
| 92 | std::move(enforced_settings), |
| 93 | reproduce_query.is_verbose); |
| 94 | } |
| 95 | else if (reproduce_query.mode == ASTReproduceQuery::Mode::EXECUTE) |
| 96 | { |
| 97 | return reproduceExecuteImpl(std::move(reproducer), |
| 98 | std::move(queries_to_reproduce), |
| 99 | std::move(enforced_settings), |
| 100 | reproduce_query.is_verbose); |
| 101 | } |
nothing calls this directly
no test coverage detected