diff --git a/ydb/core/kqp/common/compilation/result.cpp b/ydb/core/kqp/common/compilation/result.cpp index 292cd0d03c4b..02672db8189a 100644 --- a/ydb/core/kqp/common/compilation/result.cpp +++ b/ydb/core/kqp/common/compilation/result.cpp @@ -2,4 +2,11 @@ namespace NKikimr::NKqp { +std::shared_ptr TKqpCompileResult::GetAst() const { + if (QueryAst) { + return QueryAst->Ast; + } + return nullptr; +} + } // namespace NKikimr::NKqp diff --git a/ydb/core/kqp/common/compilation/result.h b/ydb/core/kqp/common/compilation/result.h index e5ab7cfc7d6a..1f74b7f8f045 100644 --- a/ydb/core/kqp/common/compilation/result.h +++ b/ydb/core/kqp/common/compilation/result.h @@ -1,5 +1,6 @@ #pragma once #include +#include #include #include #include @@ -14,24 +15,26 @@ struct TKqpCompileResult { using TConstPtr = std::shared_ptr; TKqpCompileResult(const TString& uid, const Ydb::StatusIds::StatusCode& status, const NYql::TIssues& issues, - ETableReadType maxReadType, TMaybe query = {}, std::shared_ptr ast = {}, + ETableReadType maxReadType, TMaybe query = {}, TMaybe queryAst = {}, bool needToSplit = false, const TMaybe& commandTagName = {}) : Status(status) , Issues(issues) , Query(std::move(query)) , Uid(uid) , MaxReadType(maxReadType) - , Ast(std::move(ast)) + , QueryAst(std::move(queryAst)) , NeedToSplit(needToSplit) , CommandTagName(commandTagName) {} static std::shared_ptr Make(const TString& uid, const Ydb::StatusIds::StatusCode& status, const NYql::TIssues& issues, ETableReadType maxReadType, TMaybe query = {}, - std::shared_ptr ast = {}, bool needToSplit = false, const TMaybe& commandTagName = {}) + TMaybe queryAst = {}, bool needToSplit = false, const TMaybe& commandTagName = {}) { - return std::make_shared(uid, status, issues, maxReadType, std::move(query), std::move(ast), needToSplit, commandTagName); + return std::make_shared(uid, status, issues, maxReadType, std::move(query), std::move(queryAst), needToSplit, commandTagName); } + std::shared_ptr GetAst() const; + Ydb::StatusIds::StatusCode Status; NYql::TIssues Issues; @@ -40,7 +43,7 @@ struct TKqpCompileResult { ETableReadType MaxReadType; bool AllowCache = true; - std::shared_ptr Ast; + TMaybe QueryAst; bool NeedToSplit = false; TMaybe CommandTagName = {}; diff --git a/ydb/core/kqp/compile_service/kqp_compile_actor.cpp b/ydb/core/kqp/compile_service/kqp_compile_actor.cpp index 95de8ccb252c..4e496d6bd276 100644 --- a/ydb/core/kqp/compile_service/kqp_compile_actor.cpp +++ b/ydb/core/kqp/compile_service/kqp_compile_actor.cpp @@ -379,9 +379,9 @@ class TKqpCompileActor : public TActorBootstrapped { void ReplyError(Ydb::StatusIds::StatusCode status, const TIssues& issues) { if (!KqpCompileResult) { - KqpCompileResult = TKqpCompileResult::Make(Uid, status, issues, ETableReadType::Other, std::move(QueryId)); + KqpCompileResult = TKqpCompileResult::Make(Uid, status, issues, ETableReadType::Other, std::move(QueryId), std::move(QueryAst)); } else { - KqpCompileResult = TKqpCompileResult::Make(Uid, status, issues, ETableReadType::Other, std::move(KqpCompileResult->Query)); + KqpCompileResult = TKqpCompileResult::Make(Uid, status, issues, ETableReadType::Other, std::move(KqpCompileResult->Query), std::move(KqpCompileResult->QueryAst)); } Reply(); @@ -456,10 +456,6 @@ class TKqpCompileActor : public TActorBootstrapped { preparedQueryHolder->MutableLlvmSettings().Fill(Config, queryType); KqpCompileResult->PreparedQuery = preparedQueryHolder; KqpCompileResult->AllowCache = CanCacheQuery(KqpCompileResult->PreparedQuery->GetPhysicalQuery()) && allowCache; - - if (QueryAst) { - KqpCompileResult->Ast = QueryAst->Ast; - } } void Handle(TEvKqp::TEvContinueProcess::TPtr &ev, const TActorContext &ctx) { @@ -478,7 +474,7 @@ class TKqpCompileActor : public TActorBootstrapped { if (kqpResult.NeedToSplit) { KqpCompileResult = TKqpCompileResult::Make( - Uid, status, kqpResult.Issues(), ETableReadType::Other, std::move(QueryId), {}, true); + Uid, status, kqpResult.Issues(), ETableReadType::Other, std::move(QueryId), std::move(QueryAst), true); Reply(); return; } @@ -496,7 +492,7 @@ class TKqpCompileActor : public TActorBootstrapped { auto queryType = QueryId.Settings.QueryType; - KqpCompileResult = TKqpCompileResult::Make(Uid, status, kqpResult.Issues(), maxReadType, std::move(QueryId)); + KqpCompileResult = TKqpCompileResult::Make(Uid, status, kqpResult.Issues(), maxReadType, std::move(QueryId), std::move(QueryAst)); KqpCompileResult->CommandTagName = kqpResult.CommandTagName; if (status == Ydb::StatusIds::SUCCESS) { diff --git a/ydb/core/kqp/compile_service/kqp_compile_service.cpp b/ydb/core/kqp/compile_service/kqp_compile_service.cpp index af6d3002f1f9..2f6582b5dff4 100644 --- a/ydb/core/kqp/compile_service/kqp_compile_service.cpp +++ b/ydb/core/kqp/compile_service/kqp_compile_service.cpp @@ -50,16 +50,16 @@ class TKqpQueryCache { void InsertAst(const TKqpCompileResult::TConstPtr& compileResult) { Y_ENSURE(compileResult->Query); - Y_ENSURE(compileResult->Ast); + Y_ENSURE(compileResult->GetAst()); - AstIndex.emplace(GetQueryIdWithAst(*compileResult->Query, *compileResult->Ast), compileResult->Uid); + AstIndex.emplace(GetQueryIdWithAst(*compileResult->Query, *compileResult->GetAst()), compileResult->Uid); } bool Insert(const TKqpCompileResult::TConstPtr& compileResult, bool isEnableAstCache, bool isPerStatementExecution) { if (!isPerStatementExecution) { InsertQuery(compileResult); } - if (isEnableAstCache && compileResult->Ast) { + if (isEnableAstCache && compileResult->GetAst()) { InsertAst(compileResult); } @@ -76,8 +76,8 @@ class TKqpQueryCache { auto queryId = *removedItem->Value.CompileResult->Query; QueryIndex.erase(queryId); - if (removedItem->Value.CompileResult->Ast) { - AstIndex.erase(GetQueryIdWithAst(queryId, *removedItem->Value.CompileResult->Ast)); + if (removedItem->Value.CompileResult->GetAst()) { + AstIndex.erase(GetQueryIdWithAst(queryId, *removedItem->Value.CompileResult->GetAst())); } auto indexIt = Index.find(*removedItem); if (indexIt != Index.end()) { @@ -190,8 +190,8 @@ class TKqpQueryCache { Y_ABORT_UNLESS(item->Value.CompileResult->Query); auto queryId = *item->Value.CompileResult->Query; QueryIndex.erase(queryId); - if (item->Value.CompileResult->Ast) { - AstIndex.erase(GetQueryIdWithAst(queryId, *item->Value.CompileResult->Ast)); + if (item->Value.CompileResult->GetAst()) { + AstIndex.erase(GetQueryIdWithAst(queryId, *item->Value.CompileResult->GetAst())); } Index.erase(it); @@ -327,6 +327,8 @@ struct TKqpCompileRequest { NYql::TExprContext* SplitCtx; NYql::TExprNode::TPtr SplitExpr; + bool FindInCache = true; + bool IsIntrestedInResult() const { return IntrestedInResult->load(); } @@ -764,8 +766,6 @@ class TKqpCompileService : public TActorBootstrapped { } if (compileResult || request.Query) { - QueryCache.EraseByUid(request.Uid); - Counters->ReportCompileRequestCompile(dbCounters); NWilson::TSpan compileServiceSpan(TWilsonKqp::CompileService, ev->Get() ? std::move(ev->TraceId) : NWilson::TTraceId(), "CompileService"); @@ -790,12 +790,13 @@ class TKqpCompileService : public TActorBootstrapped { ); } } - TKqpCompileRequest compileRequest(ev->Sender, request.Uid, query, + TKqpCompileRequest compileRequest(ev->Sender, request.Uid, compileResult ? *compileResult->Query : *request.Query, compileSettings, request.UserToken, dbCounters, request.GUCSettings, request.ApplicationName, ev->Cookie, std::move(ev->Get()->IntrestedInResult), ev->Get()->UserRequestContext, ev->Get() ? std::move(ev->Get()->Orbit) : NLWTrace::TOrbit(), std::move(compileServiceSpan), std::move(ev->Get()->TempTablesState)); + compileRequest.FindInCache = false; if (TableServiceConfig.GetEnableAstCache() && request.QueryAst) { return CompileByAst(*request.QueryAst, compileRequest, ctx); @@ -976,7 +977,7 @@ class TKqpCompileService : public TActorBootstrapped { << ", ast: " << queryAst.Ast->Root->ToString()); auto compileResult = QueryCache.FindByAst(compileRequest.Query, *queryAst.Ast, compileRequest.CompileSettings.KeepInCache); - if (HasTempTablesNameClashes(compileResult, compileRequest.TempTablesState)) { + if (!compileRequest.FindInCache || HasTempTablesNameClashes(compileResult, compileRequest.TempTablesState)) { compileResult = nullptr; } @@ -987,7 +988,7 @@ class TKqpCompileService : public TActorBootstrapped { << ", sender: " << compileRequest.Sender << ", queryUid: " << compileResult->Uid); - compileResult->Ast->PgAutoParamValues = std::move(queryAst.Ast->PgAutoParamValues); + compileResult->GetAst()->PgAutoParamValues = std::move(queryAst.Ast->PgAutoParamValues); ReplyFromCache(compileRequest.Sender, compileResult, ctx, compileRequest.Cookie, std::move(compileRequest.Orbit), std::move(compileRequest.CompileServiceSpan)); return; @@ -1061,10 +1062,10 @@ class TKqpCompileService : public TActorBootstrapped { if (QueryCache.FindByQuery(query, keepInCache)) { return false; } - if (compileResult->Ast && QueryCache.FindByAst(query, *compileResult->Ast, keepInCache)) { + if (compileResult->GetAst() && QueryCache.FindByAst(query, *compileResult->GetAst(), keepInCache)) { return false; } - auto newCompileResult = TKqpCompileResult::Make(CreateGuidAsString(), compileResult->Status, compileResult->Issues, compileResult->MaxReadType, std::move(query), compileResult->Ast); + auto newCompileResult = TKqpCompileResult::Make(CreateGuidAsString(), compileResult->Status, compileResult->Issues, compileResult->MaxReadType, std::move(query), compileResult->QueryAst); newCompileResult->AllowCache = compileResult->AllowCache; newCompileResult->PreparedQuery = compileResult->PreparedQuery; LOG_DEBUG_S(ctx, NKikimrServices::KQP_COMPILE_SERVICE, "Insert preparing query with params, queryId: " << query.SerializeToString()); diff --git a/ydb/core/kqp/session_actor/kqp_query_state.cpp b/ydb/core/kqp/session_actor/kqp_query_state.cpp index b61237ea2d4b..98225965d603 100644 --- a/ydb/core/kqp/session_actor/kqp_query_state.cpp +++ b/ydb/core/kqp/session_actor/kqp_query_state.cpp @@ -160,7 +160,7 @@ bool TKqpQueryState::SaveAndCheckCompileResult(TEvKqp::TEvCompileResponse* ev) { CommandTagName = CompileResult->CommandTagName; } for (const auto& param : PreparedQuery->GetParameters()) { - const auto& ast = CompileResult->Ast; + const auto& ast = CompileResult->GetAst(); if (!ast || !ast->PgAutoParamValues || !ast->PgAutoParamValues->contains(param.GetName())) { ResultParams.push_back(param); } @@ -275,15 +275,9 @@ std::unique_ptr TKqpQueryState::BuildReCompileReque compileDeadline = Min(compileDeadline, QueryDeadlines.CancelAt); } - TMaybe statementAst; - if (!Statements.empty()) { - YQL_ENSURE(CurrentStatementId < Statements.size()); - statementAst = Statements[CurrentStatementId]; - } - return std::make_unique(UserToken, CompileResult->Uid, query, isQueryActionPrepare, compileDeadline, DbCounters, gUCSettingsPtr, ApplicationName, std::move(cookie), UserRequestContext, std::move(Orbit), TempTablesState, - statementAst); + CompileResult->QueryAst); } std::unique_ptr TKqpQueryState::BuildSplitRequest(std::shared_ptr> cookie, const TGUCSettings::TPtr& gUCSettingsPtr) { diff --git a/ydb/core/kqp/session_actor/kqp_session_actor.cpp b/ydb/core/kqp/session_actor/kqp_session_actor.cpp index ebc37027eb7a..e1ef6da66ea7 100644 --- a/ydb/core/kqp/session_actor/kqp_session_actor.cpp +++ b/ydb/core/kqp/session_actor/kqp_session_actor.cpp @@ -899,8 +899,8 @@ class TKqpSessionActor : public TActorBootstrapped { try { const auto& parameters = QueryState->GetYdbParameters(); QueryState->QueryData->ParseParameters(parameters); - if (QueryState->CompileResult && QueryState->CompileResult->Ast && QueryState->CompileResult->Ast->PgAutoParamValues) { - for(const auto& [name, param] : *QueryState->CompileResult->Ast->PgAutoParamValues) { + if (QueryState->CompileResult && QueryState->CompileResult->GetAst() && QueryState->CompileResult->GetAst()->PgAutoParamValues) { + for(const auto& [name, param] : *QueryState->CompileResult->GetAst()->PgAutoParamValues) { if (!parameters.contains(name)) { QueryState->QueryData->AddTypedValueParam(name, param); }