diff --git a/src/query/interpreter.cpp b/src/query/interpreter.cpp index 3ac05326a..93eba4d59 100644 --- a/src/query/interpreter.cpp +++ b/src/query/interpreter.cpp @@ -1375,6 +1375,16 @@ PreparedQuery PrepareProfileQuery(ParsedQuery parsed_query, bool in_explicit_tra &interpreter_context->ast_cache, interpreter_context->config.query); auto *cypher_query = utils::Downcast<CypherQuery>(parsed_inner_query.query); + + bool contains_csv = false; + auto clauses = cypher_query->single_query_->clauses_; + if (std::any_of(clauses.begin(), clauses.end(), + [](const auto *clause) { return clause->GetTypeInfo() == LoadCsv::kType; })) { + contains_csv = true; + } + // If this is LOAD CSV query, use PoolResource without MonotonicMemoryResource as we want to reuse allocated memory + auto use_monotonic_memory = !contains_csv; + MG_ASSERT(cypher_query, "Cypher grammar should not allow other queries in PROFILE"); Frame frame(0); SymbolTable symbol_table; @@ -1399,14 +1409,14 @@ PreparedQuery PrepareProfileQuery(ParsedQuery parsed_query, bool in_explicit_tra // We want to execute the query we are profiling lazily, so we delay // the construction of the corresponding context. stats_and_total_time = std::optional<plan::ProfilingStatsWithTotalTime>{}, - pull_plan = std::shared_ptr<PullPlanVector>(nullptr), transaction_status]( + pull_plan = std::shared_ptr<PullPlanVector>(nullptr), transaction_status, use_monotonic_memory]( AnyStream *stream, std::optional<int> n) mutable -> std::optional<QueryHandlerResult> { // No output symbols are given so that nothing is streamed. if (!stats_and_total_time) { - stats_and_total_time = - PullPlan(plan, parameters, true, dba, interpreter_context, execution_memory, - optional_username, transaction_status, nullptr, memory_limit) - .Pull(stream, {}, {}, summary); + stats_and_total_time = PullPlan(plan, parameters, true, dba, interpreter_context, + execution_memory, optional_username, transaction_status, + nullptr, memory_limit, use_monotonic_memory) + .Pull(stream, {}, {}, summary); pull_plan = std::make_shared<PullPlanVector>(ProfilingStatsToTable(*stats_and_total_time)); } @@ -2721,8 +2731,15 @@ Interpreter::PrepareResult Interpreter::Prepare(const std::string &query_string, ParseQuery(query_string, params, &interpreter_context_->ast_cache, interpreter_context_->config.query); TypedValue parsing_time{parsing_timer.Elapsed().count()}; - if (utils::Downcast<CypherQuery>(parsed_query.query)) { - auto *cypher_query = utils::Downcast<CypherQuery>(parsed_query.query); + if ((utils::Downcast<CypherQuery>(parsed_query.query) || utils::Downcast<ProfileQuery>(parsed_query.query))) { + CypherQuery *cypher_query = nullptr; + if (utils::Downcast<CypherQuery>(parsed_query.query)) { + cypher_query = utils::Downcast<CypherQuery>(parsed_query.query); + } else { + auto *profile_query = utils::Downcast<ProfileQuery>(parsed_query.query); + cypher_query = profile_query->cypher_query_; + } + if (const auto &clauses = cypher_query->single_query_->clauses_; std::any_of(clauses.begin(), clauses.end(), [](const auto *clause) { return clause->GetTypeInfo() == LoadCsv::kType; })) {